C ++에서 문자열을 문자 배열로 변환하는 방법은 무엇입니까?


103

배열 로 변환 string하고 char싶지만 char*. 문자열을 char*( malloc내 코드에 게시 한 방식으로 또는 사용하여) 변환하는 방법을 알고 있지만 그게 내가 원하는 것이 아닙니다. 나는 간단하게 변환 할 stringchar[size]배열입니다. 가능할까요?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}

12
이 나타난다는 C ++,하지 C. 할 수
프레드 라슨

@FredLarson : 확인, 편집, 감사
브라이언 브라운

3

답변:


123

제가 생각할 수있는 가장 간단한 방법은 다음과 같습니다.

string temp = "cat";
char tab2[1024];
strcpy(tab2, temp.c_str());

안전을 위해 다음을 선호 할 수 있습니다.

string temp = "cat";
char tab2[1024];
strncpy(tab2, temp.c_str(), sizeof(tab2));
tab2[sizeof(tab2) - 1] = 0;

또는 다음과 같은 방식 일 수 있습니다.

string temp = "cat";
char * tab2 = new char [temp.length()+1];
strcpy (tab2, temp.c_str());

9
문제 strncpy는 소스 문자열에서 null을 찾기 전에 크기에 도달하면 null 종료되지 않는다는 것입니다. 그것도 조심해야 해!
Fred Larson 2012

1
예, 그것이 그것을 처리하는 합리적인 방법이라고 생각합니다.
Fred Larson 2011

1
strncpy는 strncpy가 제공 한 버퍼를 오버런하지 않는다는 점에서 안전을위한 것입니다. 또한 strcpy_s는 C99에 없지만 최근 C11에 추가되었습니다.
bames53

6
나는 사람들이 안전 이라는 단어를 남용하는 방식을 좋아합니다 ... 오, 문자열을 넣을 공간이 충분하지 않으므로 잘라내 자 .. 오, 우연히 환자의 생명을 위협하는 약물 알레르기에 대한 정보를 삭제했지만 .. 더 이상 버퍼 오버런. 글쎄, 나는 그것이 안전하다고 생각 한다 ...
Karoly Horvath

4
@KarolyHorvath-다른 도메인의 안전. 당연히 기능적 요구 사항을 확인하고 어리석은 일을하지 마십시오. 그러나 버퍼를 오버런하면 무슨 일이 일어날 지 알지 못합니다. 올바른 코딩은 프로그램이 OS에서 실행하기에 "안전"하다는 것을 보장합니다. 올바른 사고 는 프로그램이 사용자가 필요로하는 것을 "안전"하게 할 수 있도록합니다.
Chowlett 2015-06-17

58

좋아, 아무도 정말 좋은 대답을하지 않았다는 사실에 놀랐습니다. 이제 내 차례입니다. 두 가지 경우가 있습니다.

  1. 일정의 문자 배열은 당신이 갈 수 있도록, 당신을 위해 좋은 충분하다

    const char *array = tmp.c_str();
  2. 또는 상수가 좋지 않도록 char 배열 을 수정해야 합니다.

    char *array = &tmp[0];

둘 다 할당 작업 일 뿐이며 대부분의 경우 새 사본이 정말로 필요한 경우 다른 동료의 답변을 따르십시오.


7
그는 문자 배열을 원하는 아닌 문자 *
harogaston

10
그가 만든 포인터는 char 배열과 동일합니다. C 및 C ++의 배열 변수는 배열의 첫 번째 요소에 대한 포인터입니다.
JustinCB

@ JustinC.B. 별로! 배열 변수 포인터로 붕괴 있지만 C ++에서는 동일하지 않습니다. 예를 들어, std::size(elem)때 C에서 + +를 잘 정의되어 elem입니다 char array하지만 때 컴파일에 실패 elem이다 char*또는 const char*당신이 그것을 볼 수 있습니다, 여기
aniliitb10

16

가장 쉬운 방법은 다음과 같습니다.

std::string myWord = "myWord";
char myArray[myWord.size()+1];//as 1 char space for null is also required
strcpy(myArray, myWord.c_str());

14
배열 크기는 C ++에서 컴파일 타임 상수 여야합니다.
interjay 2014 년

12
str.copy(cstr, str.length()+1); // since C++11
cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)

C ++에서 C를 피하는 것이 더 나은 방법이므로 strcpy 대신 std :: string :: copy 를 선택해야합니다 .



5

이 방법으로 시도해보십시오.

string line="hello world";
char * data = new char[line.size() + 1];
copy(line.begin(), line.end(), data);
data[line.size()] = '\0'; 


2

다음 strcpy()과 같이 사용할 수 있습니다 .

strcpy(tab2, tmp.c_str());

버퍼 오버 플로우에주의하십시오.


2

문자열의 크기를 미리 모르는 경우 동적으로 배열을 할당 할 수 있습니다.

auto tab2 = std::make_unique<char[]>(temp.size() + 1);
std::strcpy(tab2.get(), temp.c_str());

0

글쎄, 나는 이것이 다소 멍청 하고 간단 하다는 것을 알고 있지만 작동해야한다고 생각합니다.

string n;
cin>> n;
char b[200];
for (int i = 0; i < sizeof(n); i++)
{
    b[i] = n[i];
    cout<< b[i]<< " ";
}

글쎄,별로. 당신은 n그보다 클 수 없다고 가정하고 있습니다 b. 만약 n>b. strcpy이미 제공된 기능 을 사용하는 것이 좋습니다 . 편집 : 어떤 경우에는 strcpy_sNULL 포인터 (플랫폼이 지원하는 경우)에 대한 검사를 추가 하므로 사용 하는 것이 더 나을 수 있습니다
droidballoon

0

C ++ 11 이상을 사용하는 경우 std::snprintfover std::strcpy또는 std::strncpy안전성 때문에 (즉, 버퍼에 쓸 수있는 문자 수를 결정), null로 문자열을 종료하므로 (따라서 그것에 대해 걱정할 필요가 없습니다). 다음과 같습니다.

#include <string>
#include <cstdio>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());

C ++ 17에서는 다음과 같은 대안이 있습니다.

#include <string>
#include <cstdio>
#include <iterator>

std::string tmp = "cat";
char tab2[1024];
std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.