我想将std::string转换为char*或char[]数据类型。

std::string str = "string";
char* chr = str;

结果:"错误:不能转换' std::string '到' char '…"

有什么方法可以做到这一点?


当前回答

它不会自动转换(感谢上帝)。您必须使用c_str()方法来获取C字符串版本。

std::string str = "string";
const char *cstr = str.c_str();

注意,它返回一个const char *;你不允许改变c_str()返回的c风格字符串。如果你想处理它,你必须先复制它:

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);

其他回答

为了完整起见,不要忘记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);

这个也可以

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;  

或者,你可以使用向量来获得一个可写的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  

如果我需要c++字符串内容的可变原始副本,那么我会这样做:

std::string str = "string";
char* chr = strdup(str.c_str());

后来:

free(chr); 

So why don't I fiddle with std::vector or new[] like anyone else? Because when I need a mutable C-style raw char* string, then because I want to call C code which changes the string and C code deallocates stuff with free() and allocates with malloc() (strdup uses malloc). So if I pass my raw string to some function X written in C it might have a constraint on it's argument that it has to allocated on the heap (for example if the function might want to call realloc on the parameter). But it is highly unlikely that it would expect an argument allocated with (some user-redefined) new[]!

orlp的char*答案的安全版本使用unique_ptr:

std::string str = "string";
auto cstr = std::make_unique<char[]>(str.length() + 1);
strcpy(cstr.get(), str.c_str());