【问题标题】:Simple string output not as expected (new line appearing)简单字符串输出不符合预期(出现新行)
【发布时间】:2012-10-03 16:30:31
【问题描述】:

我有相当于下面的代码来打印一个短字符串:

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished??/not finished??";
  std::cout << s << std::endl;
  return 0;
}

但是输出出现在两行并丢失了一些字符:

finished  
ot finished??

但是/n 不是换行符!发生了什么事?

【问题讨论】:

  • @ahenderson - '/n' 不是换行符。

标签: c++ trigraphs


【解决方案1】:

在翻译的第一阶段(ISO/IEC 14882:2011(E) 的第 2.2/1 节),被称为 trigraph 序列 的字符序列被替换为单个字符。

Trigraph 序列 (2.4) 被相应的单字符内部表示替换。

其中一个三元组将??/ 映射到\。第一阶段之后,代码相当于:

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished\not finished??";
  std::cout << s << std::endl;
  return 0;
}

作为预处理阶段的结果,"finished\not finished??" 被解析为 字符串文字,其中包含表示换行符的转义序列 \n。因此输出的字符串是:finished&lt;NL&gt;ot finished??

为避免这种情况,您需要将其中一个问号转义为\?。这给了你:

#include <iostream>
#include <string>

int main(int argc, const char* argv[])
{
  std::string s = "finished?\?/not finished??";
  std::cout << s << std::endl;
  return 0;
}

这避免了??/ 被当作三合符来拾取。

【讨论】:

    【解决方案2】:

    在 gcc 4.1.2 中我收到此警告:

    cd /devserv-home/rspikol/ g++ -g -o tz tz.C tz.C:6:28: 警告:trigraph ??/ 已忽略,使用 -trigraphs 启用

    编译于 10 月 3 日星期三 12:43:16 完成

    因此,默认情况下,此版本的 gcc 不符合 C++ 标准。

    @sftrabbit:在我的 C++ 标准副本中,段落是 2.3/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-07
      • 2014-04-04
      • 2022-01-16
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2014-09-22
      相关资源
      最近更新 更多