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

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

本文关键字:报告 x00 string std 为什么      更新时间:2023-10-16

我有一个需要对字符串进行编码的函数,该函数需要能够接受0x00作为有效的"字节"。我的程序需要检查字符串的长度,但是如果我传入"x00"std::string,则length()方法返回 0。

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

std::string完全能够存储空值。但是,您必须保持警惕,因为const char*不是,并且您非常简短地构建了一个const char*,从中创建std::string

std::string a("x00");

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

std::string b("");
b.push_back('');

std::string为空清除。字符()也可以是零字节。因此,在这里,没有什么可以阻止我们正确读取数据结构。b的长度将1.

通常,您需要避免构造包含空字符的 C 字符串。如果将文件中的输入直接读取到std::string中,或者确保一次推送一个字符,则可以获得所需的结果。如果您确实需要带有空字符的常量字符串,请考虑使用其他哨兵字符而不是然后(如果您确实需要它)在加载到std::string后将这些字符替换为''

您正在传递一个空字符串。 请改用std::string(1, '')

或者std::string{ '' }(谢谢,@zett42)

使用 C++14,您可以使用字符串文本运算符来存储具有空字节的字符串:

using namespace std::string_literals;
std::string a = ""s;
std::string aa = ""s; // two null bytes are supported too