一个std ::字符串可以包含嵌入的空值?
-
27-09-2019 - |
题
有关常规的C字符串,一个空字符'\0'
表示数据的结束。
什么std::string
,可我有嵌入的空字符的字符串?
解决方案
是的,你可以在你的std::string
嵌入的空值。
示例:
std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
注意:std::string
的c_str()
构件将总是追加一个空字符到返回字符缓冲区;然而,std::string
的data()
构件可以或可以不空字符附加到返回的字符缓冲区。
<强>小心操作者的+ = 强>
一件事看出来的是不使用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::string
的data()
和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!!!
不隶属于 StackOverflow