我想将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 '…"
有什么方法可以做到这一点?
当前回答
这个也可以
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;
其他回答
下面是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风格的转换
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")
使用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结尾。
它不会自动转换(感谢上帝)。您必须使用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转换为char*或char[]数据类型”。
正如其他答案所示,你可以将std::string的内容复制到一个char数组中,或者对std::string的内容创建一个const char*,这样你就可以以“C风格”访问它。
如果你试图改变std::string的内容,std::string类型有所有的方法来做任何你可能需要做的事情。
如果你试图将它传递给某个接受char*的函数,则有std::string::c_str()。