c++ - std::string 可以包含嵌入的空值吗?

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

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

std::string 怎么样,我可以有一个嵌入空字符的字符串吗?

最佳答案

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

例子:

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

注意:std::stringc_str() 成员将始终向返回的 char 缓冲区附加一个空字符;但是,std::stringdata() 成员可能会也可能不会将空字符附加到返回的 char 缓冲区。

小心运算符+=

要注意的一件事是不要在 RHS 上将 operator+=char* 一起使用。它只会累加到空字符。

例如:

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

通常更常见的是使用std::vector来存储任意二进制数据。

std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();

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

关于c++ - std::string 可以包含嵌入的空值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44095669/

相关文章:

c++ - 为什么 goto 语句在 C++ 中被视为禁忌?

c++ - Bison 获取下一个可能的标记或确定正在尝试的规则

C++ 传递 std::string 的最快方法?

c - realloc 后奇怪的字符

c++ - 使用 strchr 或 memchr 等 C 字符串处理函数将 char 数组解析为 C++ 键值映射

c++ - 如何安全地将元素插入数组 C++?

c++ - 无法与现有变量进行结构化绑定(bind)?

c++ - 在 C++03 中将 std::string 移动到 boost::thread

c++ - 从类到字符串的隐式和显式转换

C:输出带有凯撒密码加密中的符号,为什么? pset2 CS50