我想把std::string转换为char或char[]数据类型。
std::string str = "string"; char* chr = str;
结果是。"error: cannot convert 'std::string' to 'char' ... "。
有什么方法可以做到这一点?
它不会自动转换(感谢上帝)。你必须使用c_str()方法来获得C语言字符串版本。
c_str()
std::string str = "string"; const char *cstr = str.c_str();
注意,它返回的是一个const char *;你不允许改变c_str()返回的C语言字符串。如果你想处理它,就必须先复制它。
const char *
std::string str = "string"; char *cstr = new char[str.length() + 1]; strcpy(cstr, str.c_str()); // do stuff delete [] cstr;
或者用现代C++语言。
std::vector 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-style raw char/字符串时,那么因为我要调用C代码来改变字符串,而C代码会用free()来dealloc(),用malloc()来分配东西(strdup使用malloc)。 所以,如果我把我的原始字符串传给某个函数X 用C编写,它可能会对它的参数有一个约束,即它必须在堆上分配(例如,如果函数可能要调用参数的realloc)。 但它极不可能期望一个用(一些用户定义的)new[]分配的参数!
(本答案只适用于C++98。)
请不要使用生char*。
char*
std::string str = "string"; std::vector 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'。
不要忘了以后要删除[]。
删除[]
如果你想要一个静态分配的、有限长度的数组来代替。
size_t const MAX = 80; // 最大字符数 char ca[MAX] = {}; std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca)。)
std::string不隐含地转换为这些类型,原因很简单,需要这样做通常是一种设计的味道。请确保你真的需要它。
std::string
如果你确定需要一个char*,_最好的方法可能是。
vector v(str.begin(), str.end()); char* ca = &v[0]; // pointer to start of vector
这最好是作为对bobobobo'的回答的评论,但我没有'的代表。 它实现了同样的事情,但有更好的做法。
虽然其他的答案也很有用,但如果你需要在不使用const的情况下将std::string显式转换为char*,const_cast就是你的朋友。
const_cast
std::string str = "string"; char* chr = const_cast(str.c_str());
请注意,这不会**给你一个数据的副本,它将给你一个指向字符串的指针。 它将给你一个指向字符串的指针。 因此,如果你修改了chr的元素,你将修改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::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);
下面是 "协议缓冲区 "的一个更强大的版本。
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
你可以使用迭代器来制作。
std::string str = "string"; std::string::iterator p=str.begin(); char* chr = &(*p);
好运。
char* result = strcpy((char*)malloc(str.length()+1), str.c_str());
另外,你也可以使用向量来获得一个可写的char*,如下所示。
//this handles memory manipulations and is more convenient string str; vector writable (str.begin (), str.end) ; writable .push_back ('\0'); char* cstring = &writable[0] //or &*writable.begin () //Goodluck
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")
这也可以
std::string s; std::cout
使用 unique_ptr 的 orlp'的 char* 答案的安全版本。
std::string str = "string"; auto cstr = std::make_unique(str.length() + 1); strcpy(cstr.get(), str.c_str());
它不会自动转换(感谢上帝)。你必须使用
c_str()
方法来获得C语言字符串版本。注意,它返回的是一个
const char *
;你不允许改变c_str()
返回的C语言字符串。如果你想处理它,就必须先复制它。或者用现代C++语言。
更多细节在这里,和这里,但您可以使用
如果我需要一个c++'字符串内容的可变异的原始副本,那么我会这样做。
而后。
那么为什么我不像其他人一样使用std::vector或者new[]呢? 因为当我需要一个可变的C-style raw char/字符串时,那么因为我要调用C代码来改变字符串,而C代码会用free()来dealloc(),用malloc()来分配东西(strdup使用malloc)。 所以,如果我把我的原始字符串传给某个函数X 用C编写,它可能会对它的参数有一个约束,即它必须在堆上分配(例如,如果函数可能要调用参数的realloc)。 但它极不可能期望一个用(一些用户定义的)new[]分配的参数!
(本答案只适用于C++98。)
请不要使用生
char*
。如果你只是想要一个代表相同内容的C风格的字符串。
如果你想要一个具有_新内容的C风格的字符串,一种方法(鉴于你在编译时不知道字符串的大小)是动态分配。
不要忘了以后要
删除[]
。如果你想要一个静态分配的、有限长度的数组来代替。
std::string
不隐含地转换为这些类型,原因很简单,需要这样做通常是一种设计的味道。请确保你真的需要它。如果你确定需要一个
char*
,_最好的方法可能是。这最好是作为对bobobobo'的回答的评论,但我没有'的代表。 它实现了同样的事情,但有更好的做法。
虽然其他的答案也很有用,但如果你需要在不使用const的情况下将
std::string
显式转换为char*
,const_cast
就是你的朋友。请注意,这不会**给你一个数据的副本,它将给你一个指向字符串的指针。 它将给你一个指向字符串的指针。 因此,如果你修改了
chr
的元素,你将修改str
。假设你只需要一个C语言风格的字符串作为输入来传递。
严格来说,你不能"将一个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::copy()
不会NUL终止符。 如果你需要保证在C字符串函数中使用NUL终止符。下面是 "协议缓冲区 "的一个更强大的版本。
你可以使用迭代器来制作。
好运。
另外,你也可以使用向量来获得一个可写的char*,如下所示。
OOP风格的转换
converter.hpp
converter.cpp
用途
这也可以
使用 unique_ptr 的 orlp'的 char* 答案的安全版本。