char 배열을 문자열로 변환하는 방법은 무엇입니까?


254

string 형 함수를 string사용하여 C ++ 를 char 배열로 변환하는 것은 매우 간단합니다 . 그러나 반대 방법은 무엇입니까?c_strstrcpy

: 내가 좋아하는 문자 배열이 가지고 char arr[ ] = "This is a test";에 변환 등을 할 : string str = "This is a test.

답변:


369

string클래스에는 NULL로 끝나는 C- 문자열을 취하는 생성자가 있습니다.

char arr[ ] = "This is a test";

string str(arr);


//  You can also assign directly to a string.
str = "This is another string";

// or
str = arr;

2
여전히 어느 쪽이든 작동합니다. 오버로드 된 대입 연산자는을 사용 const char*하므로 문자열 리터럴 또는 char 배열 (부패되는)을 전달할 수 있습니다.
신비주의

3
@ kingsmasher1 : 엄밀히 말하면 양식의 문자열 "hello world" 배열입니다. sizeof("hello world")이것을 사용 하면 포인터의 크기 (4 또는 8)가 아닌 배열의 크기 (12)를 얻을 수 있습니다.
dreamlax

7
이것은 NULL로 끝나는 일정한 C- 문자열 에만 적용 됩니다. string와하지 않습니다 일 생성자는 예를 들어, 전달 된 인수 문자열은 선언 unsigned char * buffer, 바이트 스트림 라이브러리를 처리에서 매우 일반적인 것을.
CXJ

4
일정한 것이 필요하지 않습니다. char 유형의 바이트 버퍼가있는 경우 다른 생성자 :을 사용할 수 std::string str(buffer, buffer+size);있지만 std::vector<unsigned char>이 경우에는 고정하는 것이 좋습니다 .
R. Martinho Fernandes

2
명백 할 수도 있지만, 여기서는 변환 함수 str아닙니다 . 문자열 변수의 이름입니다. 다른 변수 이름 (예 :)을 사용할 수 있습니다 string foo(arr);. 암시 적으로 호출되는 std :: string의 생성자가 변환을 수행합니다.
Christopher K.

55

다른 해결책은 다음과 같습니다.

char arr[] = "mom";
std::cout << "hi " << std::string(arr);

추가 변수를 사용하지 않습니다.


답변에 이것이 내 Misticial의 승인 된 답변과 어떻게 다른지 알려주시겠습니까?
Maarten Bodewes

@owlstead 편집을 참조하십시오. 답을 찾기 위해이 페이지를 처음 방문했을 때보고 싶었 기 때문에 답을 넣었습니다. 저만큼 바보 같은 사람이이 페이지를 방문했지만 첫 번째 답변을 보지 못하여 연결을 만들 수 없다면 내 답변이 도움이 되길 바랍니다.
stackPusher

5
string ()은 std :: string의 생성자이므로 std 네임 스페이스를 사용하지 않는 경우 네임 스페이스 std를 추가해야합니다. 예 :cout << "test:" + std::string(arr);
Christopher K.

1
@ChristopherK. 나는 최고 등급의 답변을 했으므로 그것을 제외했습니다. 내 대답은 그 대답을 보완하기위한 것이므로 같은 가정을 유지했습니다. 그 이해 나던 희망의 사람이 당신의 코멘트를 볼 수 있습니다
stackPusher

str은 변수 이름 string aString(someChar);입니까 아니면 여기서 사용할 수있는 열쇠 입니까?
Driss Bounouar

31

최고 투표 답변에서 누락 된 작은 문제가 있습니다. 즉, 문자형 배열은 0을 포함 할 수 있습니다. 위에서 지적한대로 단일 매개 변수와 함께 생성자를 사용하면 일부 데이터가 손실됩니다. 가능한 해결책은 다음과 같습니다.

cout << string("123\0 123") << endl;
cout << string("123\0 123", 8) << endl;

출력은 다음과 같습니다

123
123 123


2
std::string이진 데이터의 컨테이너로 사용 하고 있고 배열에 '\ 0'이 포함되어 있지 않다고 확신 할 수없는 경우에 더 나은 대답 입니다.
Assil Ksiksi

11
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main ()
{
  char *tmp = (char *)malloc(128);
  int n=sprintf(tmp, "Hello from Chile.");

  string tmp_str = tmp;


  cout << *tmp << " : is a char array beginning with " <<n <<" chars long\n" << endl;
  cout << tmp_str << " : is a string with " <<n <<" chars long\n" << endl;

 free(tmp); 
 return 0;
}

밖:

H : is a char array beginning with 17 chars long

Hello from Chile. :is a string with 17 chars long

무료 (tmp)는 어디에 있습니까? 끈이 그것을 처리합니까?
huseyin tugrul buyukisik

1
좋은 질문. malloc을 사용하고 있기 때문에 무료로 있어야한다고 생각합니다.
Cristian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.