我想将std::string转换为char*或char[]数据类型。
std::string str = "string";
char* chr = str;
结果:"错误:不能转换' std::string '到' char '…"
有什么方法可以做到这一点?
我想将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);
其他回答
使用c_str()成员函数从std::string对象中获取const char *类型:
std::string str = "string";
const char* chr = str.c_str();
要从std::string中获得非const char *,可以使用data()成员函数,该函数从c++ 17开始返回一个非const指针:
std::string str = "string";
char* chr = str.data();
对于该语言的旧版本,您可以使用范围构造将字符串复制到一个vector中,从中可以获得非const指针:
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()之前不能保证以null结尾。
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
假设你只需要一个c风格的字符串作为输入传递:
std::string str = "string";
const char* chr = str.c_str();
这可能是对bobobobo的回答的一个更好的评论,但我没有那个代表。它完成了同样的事情,但是使用了更好的实践。
虽然其他答案很有用,但如果你需要显式地将std::string转换为char*而不使用const, const_cast是你的朋友。
std::string str = "string";
char* chr = const_cast<char*>(str.c_str());
注意,这不会为您提供数据的副本;它会给你一个指向字符串的指针。因此,如果修改chr的一个元素,就会修改str。
If you just want a C-style string representing the same content: char const* ca = str.c_str(); If you want a C-style string with new contents, one way (given that you don't know the string size at compile-time) is dynamic allocation: char* ca = new char[str.size()+1]; std::copy(str.begin(), str.end(), ca); ca[str.size()] = '\0'; Don't forget to delete[] it later. If you want a statically-allocated, limited-length array instead: 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);
string不会隐式转换为这些类型,原因很简单,需要这样做通常是一种设计风格。确保你真的需要它。
如果你确实需要一个char*,最好的方法可能是:
vector<char> v(str.begin(), str.end());
char* ca = &v[0]; // pointer to start of vector