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

时间:2018-01-14 23:39:18

标签: c++ c++11 stdstring string-length

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

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

3 个答案:

答案 0 :(得分:45)

+0.0完全能够存储空值。但是,您必须要警惕,因为std::string不是,并且您非常简短地构建const char*,您可以从中创建const char*

std::string

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

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

std::string b(""); b.push_back('\0'); 是空的。字符(std::string)也可以自由地为零字节。所以,在这里,没有什么能阻止我们正确阅读数据结构。 \0的长度为b

通常,您需要避免构造包含空字符的C字符串。如果您将文件中的输入直接读入1或确保一次按下一个字符,则可以获得所需的结果。如果你真的需要一个包含空字符的常量字符串,请考虑使用其他一些标记字符而不是std::string,然后(如果真的需要它)将这些字符替换为\0之后加载到'\0'

答案 1 :(得分:29)

你传入一个空字符串。请改用std::string(1, '\0')

std::string{ '\0' }(谢谢,@ zett42)

答案 2 :(得分:24)

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

using namespace std::string_literals;

std::string a = "\0"s;
std::string aa = "\0\0"s; // two null bytes are supported too