我有一个需要编码字符串的函数,它需要能够接受0x00作为有效的'字节'。我的程序需要检查字符串的长度,但是如果我将"\x00"
传递给std::string
,length()
方法将返回0.
即使字符串是单个空字符,如何获得实际长度?
答案 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