0

来自C++ 字符串文字转义字符的规则,Eli 的回答

std::string ("0\0" "0", 3)  // String concatenation 

之所以有效,是因为此版本的构造函数采用 char 数组;如果您尝试将“0\0”“0”作为 const char* 传递,它会将其视为 C 字符串,并且只会复制所有内容,直到出现空字符。

这是否意味着没有为整个字符串分配空间,即 \0 之后的字符串写在未分配的空间上?

此外,上面的问题是针对 c++ 字符串的,我也观察到了 c 字符串的相同行为。当我在声明期间在字符串中间添加空字符时,c 和 c++ 字符串是否相同?

4

2 回答 2

2

char 数组被复制到新对象中。如果不指定 char 数组的长度,C++ 将复制到第一个空字符。分配了多少额外空间超出了规范的范围。与向量一样,字符串的容量可能超过存储字符串所需的容量,并且允许在不重新定位字符串的情况下追加字符。

于 2013-07-28T08:34:45.880 回答
0

std::string采用 a 的构造函数const char*假定输入是 C 字符串。C 字符串'\0'在到达 '\0' 字符时终止并因此停止。

如果你真的想玩,你需要使用从 char 数组(不是 C 字符串)构建字符串的构造函数。

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;
}
于 2013-07-28T08:50:00.883 回答