将C样式字符串转换为C++;字符串 < >将C样式字符串转换成C++ >代码> STD::String < /C> >,最好的方法是什么?在过去,我使用stringstreams来完成它。有更好的方法吗?
C++字符串有一个构造函数,可以让您直接从C样式字符串构造将C样式字符串转换为C++;字符串 < >将C样式字符串转换成C++ >代码> STD::String < /C> >,最好的方法是什么?在过去,我使用stringstreams来完成它。有更好的方法吗?,c++,string,cstring,C++,String,Cstring,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在注释中所指出的,要小心确保初始化std::string的指针不是空指针。如果是,上述代码将导致未定义的行为。同样,如
std::string
:
const char* myStr = "This is a C string!";
std::string myCppString = myStr;
或者,或者:
std::string myCppString = "This is a C string!";
正如@TrevorHickey在注释中所指出的,要小心确保初始化
std::string
的指针不是空指针。如果是,上述代码将导致未定义的行为。同样,如果您有一个空指针,可能会认为您甚至没有字符串。:-) 您可以直接从c字符串初始化std::string
:
std::string s = "i am a c string";
std::string t = std::string("i am one too");
检查string类的不同构造函数: 您可能对以下内容感兴趣:
//string(char* s)
std::string str(cstring);
以及:
如果您指的是
char*
到std::string
,则可以使用构造函数
char* a;
std::string s(a);
或者,如果字符串s
已经存在,只需编写以下内容:
s=std::string(a);
通常(无需声明新存储),您只需使用1-arg构造函数将c字符串更改为字符串右值:
string xyz = std::string("this is a test") +
std::string(" for the next 60 seconds ") +
std::string("of the emergency broadcast system.");
但是,当构造字符串以通过引用将其传递给函数(我刚才遇到的问题)时,这不起作用,例如
您需要将引用设置为常量引用:
void ProcessString(const std::string& username);
ProcessString(std::string("this is a test")); // works.
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\u literals
命名空间中的运算符
using namespace std::string_literals;
auto s3 = "abc\0\0def"s; // is a std::string
什么是cstring?你是说来自MFC的
CString
?还是以null结尾的字符数组(C字符串)?还是别的什么?现在我还要做删除myStr代码>否?@Barnabaszabolcs否,这不是必需的。您只需要删除分配给new的内存。指向字符串文本的指针不需要取消分配。这里的每个答案都没有提到明显的边缘情况。如果char*为NULL,则std::string将抛出。它不会像许多人所怀疑的那样是一个空字符串。不幸的是,stackoverflow上的所有头条帖子都没有提到这一点,我怀疑许多在谷歌上搜索这个简单转换的人后来都在处理这些bug。@TrevorHickey虽然这是真的,但有人可能会说NULL不是字符串。是缺少字符串。@templatetypedef同意。这里的答案没有错,但是关于NULL的免责声明对于帮助他人来说会有很大帮助。有许多常用函数(“getenv()”例如),当使用相同的输入调用时,这些函数可能返回NULL,也可能不返回NULL。给新来者一句简单的一句话,而不加上免责声明,就是在让他们失败。您的示例将在std::string的构造函数中抛出一个逻辑错误a'不能为空。
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
using namespace std::string_literals;
auto s3 = "abc\0\0def"s; // is a std::string