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

Wil*_*mKF 37 c++ c-strings stdstring null-terminated

对于常规C字符串,空字符'\0'表示数据的结尾.

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

Bri*_*ndy 40

是的,你可以嵌入空值std::string.

例:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
Run Code Online (Sandbox Code Playgroud)

注意:std::stringc_str()成员将始终在返回的char缓冲区中附加一个空字符; 然而,std::stringdata()部件可以或可以不追加一个空字符到返回的字符缓冲区.

注意操作符+ =

有一件事看出来的是不使用operator+=char*在RHS.它只会在空字符之前加起来.

例如:

std::string s = "hello";
s += "\0world";
assert(s.length() == 5);
Run Code Online (Sandbox Code Playgroud)

正确的方法:

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

存储二进制数据更常用于使用std :: vector

通常,std::vector用于存储任意二进制数据更常见.

std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();
Run Code Online (Sandbox Code Playgroud)

因为这可能是更常见std::stringdata()c_str()成员返回常量指针,所以内存是不可修改的.使用&buf.front(),您可以直接修改缓冲区的内容.

  • 请注意,从C++ 11开始,`.c_str()`和`.data`是同义词.特别是,这意味着`.data`返回的字符串必须附加一个空终止符. (8认同)
  • 在C++ 9x中,`&s.front()`也可以修改并保证指向连续的缓冲区.虽然在C++ 03中没有这样的保证,但是没有已知的C++实现在实践中并不成立(这也是为什么它如此迅速地被添加到C++ 0x的原因). (2认同)

bma*_*ies 7

是.std :: string只是一个vector<char>有益处.

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