【发布时间】:2011-06-13 11:43:03
【问题描述】:
将 C 样式字符串转换为 C++ std::string 的最佳方法是什么?在过去,我使用stringstreams 完成了它。有没有更好的办法?
【问题讨论】:
-
什么是字符串?您是指来自 MFC 的
CString吗?还是一个以 null 结尾的 char 数组(一个 C 字符串)?还是别的什么?
将 C 样式字符串转换为 C++ std::string 的最佳方法是什么?在过去,我使用stringstreams 完成了它。有没有更好的办法?
【问题讨论】:
CString 吗?还是一个以 null 结尾的 char 数组(一个 C 字符串)?还是别的什么?
C++ 字符串有一个构造函数,可让您直接从 C 风格的字符串构造 std::string:
const char* myStr = "This is a C string!";
std::string myCppString = myStr;
或者,或者:
std::string myCppString = "This is a C string!";
正如@TrevorHickey 在 cmets 中指出的那样,请注意确保您用于初始化 std::string 的指针不是空指针。如果是,上面的代码会导致未定义的行为。再说一次,如果你有一个空指针,有人可能会争辩说你根本没有字符串。 :-)
【讨论】:
delete myStr; 不?
查看字符串类的不同构造函数:documentation 您可能对以下内容感兴趣:
//string(char* s)
std::string str(cstring);
还有:
//string(char* s, size_t n)
std::string str(cstring, len_str);
【讨论】:
如果你的意思是char* 到std::string,你可以使用构造函数。
char* a;
std::string s(a);
或者如果string s 已经存在,只需这样写:
s=std::string(a);
【讨论】:
C++11:重载字符串文字运算符
std::string operator ""_s(const char * str, std::size_t len) {
return std::string(str, len);
}
auto s1 = "abc\0\0def"; // C style string
auto s2 = "abc\0\0def"_s; // C++ style std::string
C++14:使用来自std::string_literals命名空间的运算符
using namespace std::string_literals;
auto s3 = "abc\0\0def"s; // is a std::string
【讨论】:
您可以直接从 c 字符串初始化 std::string:
std::string s = "i am a c string";
std::string t = std::string("i am one too");
【讨论】:
一般情况下(不声明新存储),您可以只使用 1-arg 构造函数将 c-string 更改为字符串右值:
string xyz = std::string("this is a test") +
std::string(" for the next 60 seconds ") +
std::string("of the emergency broadcast system.");
但是,在构造字符串以通过引用函数来传递它时,这不起作用(我刚刚遇到的一个问题),例如
void ProcessString(std::string& username);
ProcessString(std::string("this is a test")); // fails
您需要将引用设为 const 引用:
void ProcessString(const std::string& username);
ProcessString(std::string("this is a test")); // works.
【讨论】:
现在还有另一种用于 char 数组的方法。类似于std::vector的初始化,至少我记得是这样。
char cBuf[256] = "Hello World";
std::cout << cBuf << '\n';
std::string str{std::begin(cBuf), std::end(cBuf)};
std::cout << str << '\n';
【讨论】: