简单的字符串输出不符合预期(出现新行)

时间:2012-10-03 16:30:31

标签: c++ trigraphs

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

#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不是新行字符!发生了什么事?

2 个答案:

答案 0 :(得分:4)

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

  

Trigraph sequence(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<NL>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;
}

这可以避免将??/作为三字母拾取。

答案 1 :(得分:0)

在gcc 4.1.2中,我收到此警告:

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

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

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

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