Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C样式字符串转换为C++;字符串 < >将C样式字符串转换成C++ >代码> STD::String < /C> >,最好的方法是什么?在过去,我使用stringstreams来完成它。有更好的方法吗?_C++_String_Cstring - Fatal编程技术网

将C样式字符串转换为C++;字符串 < >将C样式字符串转换成C++ >代码> STD::String < /C> >,最好的方法是什么?在过去,我使用stringstreams来完成它。有更好的方法吗?

将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的指针不是空指针。如果是,上述代码将导致未定义的行为。同样,如

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
的指针不是空指针。如果是,上述代码将导致未定义的行为。同样,如果您有一个空指针,可能会认为您甚至没有字符串。:-)

您可以直接从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