为什么 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
我有一个函数需要对字符串进行编码,它需要能够接受 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