有关常规的C字符串,一个空字符'\0'表示数据的结束。

什么std::string,可我有嵌入的空字符的字符串?

有帮助吗?

解决方案

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

示例:

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

注意:std::stringc_str()构件将总是追加一个空字符到返回字符缓冲区;然而,std::stringdata()构件可以或可以不空字符附加到返回的字符缓冲区。

<强>小心操作者的+ =

一件事看出来的是不使用operator+=用在RHS一个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 ::矢量

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

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

因为std::stringdata()c_str()构件返回常量指针,以便该存储器是不可修改这可能是更常见的。与&buf.front()你可以自由地直接修改缓冲器的内容。

其他提示

是。甲的std :: string仅仅是一个好处vector<char>

然而,必须注意使这样的野兽的东西,呼叫.c_str()并在0停止。

可以,但为什么要?嵌入NUL在的std :: string是自找麻烦,因为功能,你传递一个的std :: string可以很好地使用它的c_str()成员,大多数人会认为第一NUL表示字符串的结束。因此,这不是一个好主意,这样做。还要注意的是在UTF-8,只有“\ 0”将导致一个0,所以即使对I18N目的,有用于嵌入完全无效没有道理的。

是的,这是有效的。

您可以在字符串的中间一个空字符。

不过,如果你在中间使用的std :: string以空字符有一个C语言字符串 功能您不确定的行为镇 - 没有人希望在那里!

 int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top