当字符发生变化时,为什么这个std :: string的大小会发生变化?

sam*_*mer 26 c++ string escaping

我有一个问题,其中字符串的大小是由一个'\0'字符的存在实现的.我搜索到了所有的东西,但仍无法得到答案.

这是片段.

int main()
{
  std::string a = "123123\0shai\0";
  std::cout << a.length();
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/W6Bhfl

这种情况下的输出是

6
Run Code Online (Sandbox Code Playgroud)

其中具有不同字符串的相同程序具有数字而不是字符

int main()
{
  std::string a = "123123\0123\0";
  std::cout << a.length();
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/mtfS50

给出一个输出

8
Run Code Online (Sandbox Code Playgroud)

引擎盖下究竟发生了什么?'\0'角色的存在如何改变行为?

Som*_*ude 47

该序列\012在字符串(或字符),用于文字时是一个八进制的转义序列.它是八进制数12,对应于ASCII linefeed('\n')字符.

这意味着你的第二个字符串实际上等于"123123\n3\0"(加上实际的字符串文字终结符).

如果您尝试打印字符串的内容,那将非常清楚.

八进制序列长度为一到三位,编译器将使用尽可能多的数字.

  • @KyleStrand听起来你需要接触一些C字符串.它们的行为与Java,C#,Python等高级语言中的字符串的行为不同."空字符"(`\ 0`)在C字符串中具有特殊含义; 也就是说,它标志着字符串的结尾. (2认同)

Bo *_*son 12

如果你检查ideone上的着色,你会看到它 \012有不同的颜色.那是因为这是用八进制写的单个字符.

  • @slawekwin - 你可能必须分开字符串,如果你不*想要形成一个最大长度八进制序列,如`"12345""\ 01""678"`中间有一个ASCII 1的字符.编译器将组合相邻的字符串文字.如果你使用带有长度参数的字符串构造函数,你也可以得到一个std :: string*,包括*nul字符,比如`std :: string a("123123\0shai\0",12);`.这将包括字符串中的所有12个字符. (11认同)
  • @Raw - 序列的长度或不能是八进制数字的字符.就像`\ 0shai`中的s一样. (5认同)
  • 什么*停止*字符串中的八进制序列? (2认同)