来自Rules for C++ string literals escape character,Eli的回答
std::string ("0\0" "0", 3) // String concatenation
有效,因为此版本的构造函数采用char数组;如果您尝试将“0 \ 0”“0”作为常量字符*传递,它会将其视为C字符串,并且仅将所有内容复制到空字符。
这是否意味着空间不是为整个字符串分配的,即\ 0之后的字符串写在未分配的空格上?
此外,上面的问题是针对c ++字符串,我也观察到c字符串的相同行为。 当我在声明期间在字符串中间添加空字符时,c和c ++字符串是否相同?
答案 0 :(得分:2)
将char数组复制到新对象中。如果未指定char数组的长度,C ++将复制到第一个空字符。分配了多少额外空间超出了规范的范围。与向量一样,字符串的容量可能超过存储字符串所需的量,并允许在不重定位字符串的情况下附加字符。
答案 1 :(得分:0)
std::string
的 const char*
构造函数假定输入是C字符串。
C字符串被'\0'
终止,因此当它到达'\ 0'字符时停止。
如果你真的想玩,你需要使用构建字符串的构造函数 char数组(不是C-String)。
STL序列容器超过自动存储所需的数量
示例:
int main () {
string s="Elephant";
s[4] ='\0'; //C++ std::string is NOT '\0' terminated
cout<<s<<endl; //Elep ant
string x("xy\0ab"); // C-String assumed.
cout<<x; //xy
return 0;
}