如何在c ++中的basic_string中使用null值

on_*_*sea 2 c++ string null

有没有办法在里面拥有和处理空值std::basic_string

有时传递的字符串序列具有空值.例如,下面的代码输出1234,5678而不是整个字符串.

#include <iostream>
#include <string>
#include <cstring>
int main ()
{
   int length;
   std::string str = "1234,5678\000,ABCD,EFG#";
   std::cout << "length"<<str.c_str();
}
Run Code Online (Sandbox Code Playgroud)

我需要得到完整的字符串.

Mik*_*our 6

首先,你必须告诉字符串构造函数的大小; 它只能在输入为空终止时确定大小.像这样的东西会起作用:

std::string str("1234,5678\000,ABCD,EFG#", sizeof("1234,5678\000,ABCD,EFG#")-1);
Run Code Online (Sandbox Code Playgroud)

没有特别好的方法来避免重复; 你可以声明一个本地数组

char c_str[] = "1234,5678\000,ABCD,EFG#"; // In C++11, perhaps 'auto const & c_str = "...";'
std::string str(c_str, sizeof(c_str)-1);
Run Code Online (Sandbox Code Playgroud)

可能有运行时成本; 或者你可以使用宏; 或者你可以将字符串构建成碎片

std::string str = "1234,5678";
str += '\0';
str += ",ABCD,EFG#";
Run Code Online (Sandbox Code Playgroud)

最后,流式传输字符串本身(其大小已知)而不是提取c字符串指针(其大小将通过查找空终止符来确定):

std::cout << "length" << str;
Run Code Online (Sandbox Code Playgroud)

更新:正如评论中所指出的,C++ 14为basic_string文字添加了一个后缀:

std::string str = "1234,5678\000,ABCD,EFG#"s;
                                           ^
Run Code Online (Sandbox Code Playgroud)

通过我阅读标准草案,即使存在嵌入的空字符,它也应该起作用.