std:: 문자열에서 char*
std:: 문자열을 char* 또는 char[] 데이터 형식으로 변환합니다.
std::string str = "string";
char* chr = str;
결과: "error: cannot convert 'std::string'을 'char'로 변환할 수 없습니다."
이를 위해 어떤 방법을 사용할 수 있습니까?
자동 변환이 되지 않는다.당신은 그 방법을 사용해야 할 수 있습니다.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++11부터는 멤버 함수를 사용할 수도 있습니다.이 함수는char *
string str = "some string" ;
char *cstr = str.data();
c++ 문자열 내용의 가변 미가공 복사가 필요한 경우 다음을 수행합니다.
std::string str = "string";
char* chr = strdup(str.c_str());
이후:
free(chr);
그럼 다른 사람들처럼 std::vector나 new[]를 만지면 어떨까요?변경 가능한 C 스타일의 raw char* 문자열이 필요한 경우 문자열을 변경하는 C 코드를 호출하고 C 코드를 free()로 할당 해제하고 malloc()로 할당합니다(strdup은 malloc을 사용합니다).따라서 Raw 문자열을 C로 기술된 함수 X에 전달하면 힙에 할당해야 한다는 인수에 제약이 있을 수 있습니다(예를 들어 함수가 파라미터에 재할당을 호출하는 경우).그러나 (일부 사용자가 재정의한) new[]를 사용하여 할당된 인수를 예상할 가능성은 거의 없습니다.
(이 답변은 C++98에만 적용됩니다).
생선은 사용하지 마세요.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
보보보의 답변에 대한 코멘트로 이것이 더 낫겠지만, 나는 그것에 대해 잘 알지 못한다.그것은 같은 일을 하지만 더 나은 실천을 통해 이뤄진다.
다른 답변도 유용하지만 변환이 필요한 경우std::string로로 합니다.char*const를 하지 않고, 「」를 사용해 주세요.const_cast네 친구잖아
std::string str = "string";
char* chr = const_cast<char*>(str.c_str());
데이터 복사본은 제공되지 않으며 문자열에 대한 포인터가 제공됩니다.이 때문에, 다음의 요소를 변경했을 경우,chrstr.
입력으로 전달할 C 스타일 문자열이 필요한 경우:
std::string str = "string";
const char* chr = str.c_str();
「 」를 const char * std::stringmember 함수를 사용합니다.
std::string str = "string";
const char* chr = str.c_str();
를 char * std::stringC++17 이후 정수 이외의 포인터를 반환하는 멤버 함수를 사용할 수 있습니다.
std::string str = "string";
char* chr = str.data();
이전 버전의 언어에서는 범위 구성을 사용하여 문자열을 비정수 포인터를 얻을 수 있는 벡터에 복사할 수 있습니다.
std::string str = "string";
std::vector<char> str_copy(str.c_str(), str.c_str() + str.size() + 1);
char* chr = str_copy.data();
, 해서 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ,str이 방법으로 변경할 수 있는 것은 복사본의 데이터뿐입니다.을 사용하는 것이 c_str()std::string까지는 무효가 보증되지 않았습니다.c_str()을 사용하다
엄밀히 말하면 std:: 문자열을 char* 또는 char[] 데이터 유형으로 변환할 수 없습니다.
다른 답변에서 보듯이 std:: 문자열의 내용을 char 배열에 복사하거나 std:: 문자열의 내용에 const char*를 만들어 "C style"로 액세스할 수 있습니다.
std:: 문자열의 내용을 변경하려는 경우 std:: 문자열 유형에는 필요한 모든 방법을 사용할 수 있습니다.
char*를 사용하는 함수에 전달하려고 하면 std::string::c_str()이 있습니다.
더 강력한 .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
OOP 스타일로 변환
컨버터.hpp
class StringConverter {
public: static char * strToChar(std::string str);
};
컨버터.cpp
char * StringConverter::strToChar(std::string str)
{
return (char*)str.c_str();
}
사용.
StringConverter::strToChar("converted string")
기하기 std::string::copy().
std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];
str.copy(chrs, MAX);
std::string::copy()누루C 문자열 함수에서 NUL 터미네이터를 사용해야 하는 경우:
std::string str = "string";
const size_t MAX = 80;
char chrs[MAX];
memset(chrs, '\0', MAX);
str.copy(chrs, MAX-1);
반복기를 사용해서 만들 수 있어요.
std::string str = "string";
std::string::iterator p=str.begin();
char* chr = &(*p);
행운을 빌어요.
unique_ptr을 사용한 orlp char* 응답의 안전한 버전:
std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
또는 다음과 같이 벡터를 사용하여 쓰기 가능한 문자*를 얻을 수 있습니다.
//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 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;
아무도 스프린트프라고 말한 적 없어?
std::string s;
char * c;
sprintf(c, "%s", s.c_str());
언급URL : https://stackoverflow.com/questions/7352099/stdstring-to-char
'programing' 카테고리의 다른 글
| 창의 설계 시간 DataContext를 설정하면 컴파일러 오류가 발생합니까? (0) | 2023.04.11 |
|---|---|
| 스크립트의 소스 여부를 검출하는 방법 (0) | 2023.04.11 |
| 텍스트와 varchar의 차이(문자에 따라 다름) (0) | 2023.04.11 |
| Windows에서 msysgit을 사용하여 Git 서버 설정 (0) | 2023.04.11 |
| Bash에서 어레이를 정렬하는 방법 (0) | 2023.04.11 |