【问题标题】:Why does the size of this std::string change, when characters are changed?为什么当字符改变时这个 std::string 的大小会改变?
【发布时间】:2016-11-08 07:30:52
【问题描述】:

我有一个问题,其中字符串的大小会受到'\0' 字符的影响。我在 SO 中搜索了所有内容,但仍然无法得到答案。

这里是sn-p。

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

http://ideone.com/W6Bhfl

这种情况下的输出是

6

在同一个程序中,不同的字符串使用数字而不是字符

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

http://ideone.com/mtfS50

输出

8

幕后究竟发生了什么? '\0' 字符的存在如何改变行为?

【问题讨论】:

  • 除非您非常清楚自己在做什么以及为什么,否则不要在字符串中放入空字符 (\0)!
  • 如果你真的需要非空终止的字符串,你会想要使用std::literals::string_literals::operator""s (C++14) 或std::string(char*, size_t) (如果你想记得包括最后的空一)。
  • 请注意,您的第二个字符串将“shai”(四个字符)替换为“123”(三个字符),因此即使没有接受答案中提到的八进制序列,也会有所不同。

标签: c++ string escaping


【解决方案1】:

序列\012 在字符串(或字符)文字中使用时是一个八进制 转义序列。它是八进制数 12,对应于 ASCII 换行符 ('\n')。

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

如果你尝试打印字符串的内容会很清楚。

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

【讨论】:

  • 宾果游戏!这让我心烦意乱,谢谢你的回答。
  • 为什么第一个字符串长度不是 12 而第二个不是 9?
  • @KyleStrand 因为采用const char* 的std::string ctor 将其视为以NUL 结尾的字符串。
  • @KyleStrand 听起来你需要接触 C 字符串。它们的行为与 Java、C#、Python 等高级语言中的字符串不同。“空字符”(\0) 在 C 字符串中具有特殊含义;即,它标志着字符串的结束。
  • @jpmc26 我不确定我的 cmets 怎么样,这表明我不了解 C 字符串的工作原理。我的困惑在于调用的 std::string 构造函数的行为。请注意,即使在 C++98 中,std::string 可能 也有一个构造函数采用 const char[] reference,这将允许它接受嵌入的 null 字符来自字符串文字:std::string(const char (&amp;ch)[N])。这可能与 std::string(const char*, size_type count) 构造函数的行为相同。
【解决方案2】:

如果您检查ideone 的颜色,您会发现\012 具有不同的颜色。那是因为这是一个用八进制写的单个字符。

【讨论】:

  • 什么停止字符串中的八进制序列?
  • @Raw - 序列的长度或不能是八进制数字的字符。就像\0shai中的s一样。
  • 是否可以在 \0 之后创建带有数字 (0-7) 的文字?只有"/0" + "12" 之类的东西(或者甚至可能不起作用?)
  • @slawekwin - 如果您不想要形成最大长度的八进制序列,则可能必须分隔字符串,例如"12345" "\01" "678"在其中包含 ASCII 1 的字符中间。编译器将组合相邻的字符串文字。如果您使用带有长度参数的字符串构造函数,例如std::string a("123123\0shai\0", 12);,您还可以获得std::string 包括 nul 字符。这将包括字符串中的所有 12 个字符。
  • @slawekwin 一个八进制字符最多可以有 3 个数字,所以 "\0007" 是两个字符:'\0' 和 '7'。
猜你喜欢
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2021-12-20
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多