std :: string을 char *로
std :: string 을 char * 또는 char [] 데이터 형식 으로 변환하고 싶습니다 .
std::string str = "string";
char* chr = str;
결과 : "오류가 ... '문자'에 대한 '표준 : : 문자열을'변환 할 수 없습니다" .
이를 위해 어떤 방법을 사용할 수 있습니까?
자동으로 변환되지 않습니다 (신께 감사합니다). c_str()
C 문자열 버전을 얻으려면이 방법을 사용해야합니다 .
std::string str = "string";
const char *cstr = str.c_str();
그것은 const char *
; 에서 반환 한 C 스타일 문자열을 변경할 수 없습니다 c_str()
. 처리하려면 먼저 복사해야합니다.
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
또는 현대 C ++에서 :
std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
자세한 내용은 여기 및 여기에서 사용할 수 있습니다
string str = "some string" ;
char *cstr = &str[0];
c ++ 문자열 내용의 변경 가능한 원시 복사본이 필요한 경우 다음을 수행하십시오.
std::string str = "string";
char* chr = strdup(str.c_str());
그리고 나중에 :
free(chr);
왜 std :: vector 나 다른 사람처럼 new []를 사용하지 않겠습니까? 때문에 나는 변경 가능한 C 스타일의 원시 문자를 필요로 할 때 * 문자열, 그럼 내가 문자열을 변경하고 C 코드의 malloc () (에서는 StrDup 사용의 malloc에) 무료 () 및 할당과 물건의 할당을 해제 C 코드를 호출하기 원하기 때문에 . 따라서 원시 문자열을 C로 작성된 일부 함수 X 에 전달하면 힙에 할당해야한다는 인수에 제약 이 있을 수 있습니다 (예 : 함수가 매개 변수에서 realloc을 호출하려는 경우). 그러나 (일부 사용자가 정의한) new []로 할당 된 인수를 기대할 가능성은 거의 없습니다!
(이 답변은 C ++ 98에만 적용됩니다.)
raw를 사용하지 마십시오 char*
.
std::string str = "string";
std::vector<char> chars(str.c_str(), str.c_str() + str.size() + 1u);
// use &chars[0] as a char*
동일한 내용을 나타내는 C 스타일 문자열을 원할 경우 :
char const* ca = str.c_str();
새로운 내용 의 C 스타일 문자열을 원한다면 한 가지 방법 (컴파일 타임에 문자열 크기를 모르는 경우)은 동적 할당입니다.
char* ca = new char[str.size()+1]; std::copy(str.begin(), str.end(), ca); ca[str.size()] = '\0';
delete[]
나중에 잊지 마십시오 .대신 정적으로 할당 된 제한된 길이의 배열을 원할 경우 :
size_t const MAX = 80; // maximum number of chars char ca[MAX] = {}; std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
std::string
이 작업을 수행해야하는 단순한 이유는 일반적으로 디자인 냄새이기 때문에 이러한 유형으로 암시 적으로 변환되지 않습니다. 실제로 필요한지 확인하십시오 .
당신이 경우 확실히 필요 char*
의 가장 좋은 방법은 아마도 :
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector
이것은 bobobobo의 답변에 대한 의견으로 더 좋지만 그에 대한 담당자는 없습니다. 그것은 똑같은 일을하지만 더 나은 방법으로 달성합니다.
다른 답변이 유용하지만 혹시 변환해야하는 경우 std::string
에 char*
const를하지 않고 명시 적으로, const_cast
당신의 친구입니다.
std::string str = "string";
char* chr = const_cast<char*>(str.c_str());
이렇게하면 데이터 사본이 제공 되지 않습니다 . 문자열에 대한 포인터를 제공합니다. 따라서의 요소를 수정하면을 수정 chr
합니다 str
.
입력으로 전달하려면 C 스타일 문자열이 필요하다고 가정합니다.
std::string str = "string";
const char* chr = str.c_str();
엄밀히 말하면 "std :: string을 char * 또는 char [] 데이터 형식으로 변환 할 수 없습니다."
다른 답변에서 알 수 있듯이 std :: string의 내용을 char 배열로 복사하거나 std :: string의 내용에 const char *를 만들어 "C 스타일"로 액세스 할 수 있습니다. .
std :: string의 내용을 변경하려는 경우 std :: string 유형에는 필요한 모든 작업을 수행 할 수있는 모든 메소드가 있습니다.
char *를 사용하는 함수에 전달하려고하면 std :: string :: c_str ()이 있습니다.
완전성을 위해 잊지 마십시오 std::string::copy()
.
std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];
str.copy(chrs, MAX);
std::string::copy()
NUL이 종료되지 않습니다. C 문자열 함수에 사용하기 위해 NUL 종료자를 확인해야하는 경우 :
std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];
memset(chrs, '\0', MAX);
str.copy(chrs, MAX-1);
여기에 하나 더 강력한 버전이 있습니다 Protocol Buffer
char* string_as_array(string* str)
{
return str->empty() ? NULL : &*str->begin();
}
// test codes
std::string mystr("you are here");
char* pstr = string_as_array(&mystr);
cout << pstr << endl; // you are here
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
또는 벡터를 사용하여 아래와 같이 쓰기 가능한 char *를 얻을 수 있습니다.
//this handles memory manipulations and is more convenient
string str;
vector <char> writable (str.begin (), str.end) ;
writable .push_back ('\0');
char* cstring = &writable[0] //or &*writable.begin ()
//Goodluck
반복자를 사용하여 만들 수 있습니다.
std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);
행운을 빕니다.
이것은 또한 작동합니다
std::string s;
std::cout<<"Enter the String";
std::getline(std::cin, s);
char *a=new char[s.size()+1];
a[s.size()]=0;
memcpy(a,s.c_str(),s.size());
std::cout<<a;
unique_ptr을 사용하여 안전한 orlp char * 응답 버전 :
std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());
OOP 스타일로 변환
converter.hpp
class StringConverter {
public: static char * strToChar(std::string str);
};
converter.cpp
char * StringConverter::strToChar(std::string str)
{
return (char*)str.c_str();
}
용법
StringConverter::strToChar("converted string")
참고 URL : https://stackoverflow.com/questions/7352099/stdstring-to-char
'development' 카테고리의 다른 글
NSLog에서 부울 플래그를 인쇄하는 방법? (0) | 2020.03.15 |
---|---|
리포지토리 액세스가 거부되었습니다. (0) | 2020.03.15 |
RecyclerView로 수평 ListView를 작성하는 방법은 무엇입니까? (0) | 2020.03.15 |
Android Fragment 핸들 뒤로 버튼 누름 (0) | 2020.03.15 |
node.js 해시 문자열? (0) | 2020.03.15 |