std :: string是否可以包含嵌入的空值?

时间:2010-05-16 22:42:00

标签: c++ stdstring c-strings null-terminated

对于常规C字符串,空字符'\0'表示数据结束。

std::string怎么样,我可以使用嵌入空字符的字符串吗?

4 个答案:

答案 0 :(得分:37)

是的,您可以在std::string中嵌入空值。

示例:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);

注意:std::string的{​​{1}}成员将始终在返回的char缓冲区中附加一个空字符;但是,c_str()的{​​{1}}成员可能会也可能不会将空字符附加到返回的char缓冲区。

小心操作符+ =

要注意的一件事是不要在RHS上使用std::stringdata()。它只会在空字符之前加起来。

例如:

operator+=

正确的方法:

char*

存储更常见的二进制数据以使用std :: vector

通常,使用std::string s = "hello"; s += "\0world"; assert(s.length() == 5); 存储任意二进制数据更为常见。

std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);

这可能更常见,因为std::vector的{​​{1}}和std::vector<char> buf; buf.resize(1024); char *p = &buf.front(); 成员返回const指针,因此内存不可修改。使用&amp; buf.front(),您可以直接修改缓冲区的内容。

答案 1 :(得分:7)

是。 std :: string只是一个有效的vector<char>

但是,要小心将这样的野兽传递给调用.c_str()并停在0的东西。

答案 2 :(得分:0)

你可以,但你为什么要这样做?在std :: string中嵌入NUL只是要求麻烦,因为传递std :: string的函数可以很好地使用它的c_str()成员,并且大多数人会假设第一个NUL表示字符串的结尾。因此,这不是一个好主意。另请注意,在UTF-8中,只有'\ 0'会产生0,所以即使是出于i18n目的,也没有理由嵌入NUL。

答案 3 :(得分:-3)

是的,这是有效的。

你可以在字符串的中间加上一个空字符。

但是,如果在中间使用带有c字符串的空字符的std :: string 在未定义的行为城镇中运作 - 没有人想要在那里!!!:

 int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!