为什么 std::string("\x00") 报告长度为 0?

Why does std::string("\x00") report length of 0?

我有一个函数需要对字符串进行编码,它需要能够接受 0x00 作为有效 'byte'。我的程序需要检查字符串的长度,但是如果我将 "\x00" 传递给 std::string length() 方法 returns 0.

即使字符串是单个空字符,如何获取实际长度?

您传递的是一个空字符串。请改用 std::string(1, '[=10=]')

std::string{ '[=11=]' }(感谢@zett42)

std::string 完全能够存储空值。但是,您必须小心,因为 const char* 不是,您非常简单地构造了一个 const char*,从中创建了 std::string.

std::string a("\x00");

这将创建一个仅包含空字符的常量 C 字符串,后跟一个空终止符。但是 C 字符串不知道它们有多长;所以字符串认为它一直运行到第一个空终止符,即第一个字符。因此,创建了一个零长度字符串。

std::string b("");
b.push_back('[=11=]');

std::string 是 null-clean。字符 ([=17=]) 也可以自由地作为零字节。所以,在这里,没有什么能阻止我们正确读取数据结构。 b 的长度将是 1.

一般情况下,您需要避免构造包含空字符的C 字符串。如果您将文件中的输入直接读入 std::string 或确保一次一个地压入字符,则可以获得您想要的结果。如果您确实需要一个包含空字符的常量字符串,请考虑使用其他一些标记字符而不是 [=17=] 然后(如果您 确实 需要它)将这些字符替换为 '[=22 =]' 加载到 std::string.

使用 C++14,您可以使用 string literal operator 来存储带有空字节的字符串:

using namespace std::string_literals;

std::string a = "[=10=]"s;
std::string aa = "[=10=][=10=]"s; // two null bytes are supported too