我正在研究用于计算数据的遗留源代码。
为了调试几个错误条件,我在代码中添加了以下printf
printf("What???!!!!....\n");
日志保存在一个文件中,我正在搜索字符串“What ??? !!!! ....”但是我从未发现过这个,因为它的输出来自:
什么?| !!! ....
由于这种不必要的输出,我已经浪费了很多时间。 有人可以帮我确定原因吗?
答案 0 :(得分:2)
输出与三字符有关, 字符串
...!对应于|
检查您的makefile是否为-trigraphs
确保现在有更明智的印刷品: - )
答案 1 :(得分:1)
在过去,键盘不一定包括编写C程序所需的所有字符。为了让那些没有合适键盘的人能够编程,最早版本的C编译器使用了三字符和有向图,不常见的两个或三个字符的组合可直接转换为可能缺少的键。以下是C:
的有向图和三字符列表http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C
...!在列表中,它转换为|在预处理器中。
解决此问题的一种方法是在我上面链接的文章中:用\分隔问号,或者关闭字符串并在问号之间重新打开它。这可能是您的最佳选择,因为您正在使用遗留代码。
通常,您还可以使用编译器开关禁用有向图和三字符。有关这些详细信息,请参阅您的文档。
答案 2 :(得分:0)
Trigraphs (3个字符序列)和 Digraphs (2个字符序列),以帮助某些人输入ISO 646个字符之外的某些字符设置,并且没有与之兼容的键盘。
以下是Diagraph and Trigraphs Wiki page中的段落,其中明确指出了该段落:
C编程语言的基本字符集是其中的一个子集 包含九个字符的ASCII字符集 在ISO 646不变字符集之外。这可能会造成问题 用于在编码时编写源代码(可能还有键盘) 正在使用不支持这九个字符中的任何一个。 ANSI C 委员会发明了三字母作为使用输入源代码的一种方式 支持任何版本的ISO 646字符集的键盘。
要打印这两个问号,您可以转义第二个问号,或使用字符串连接:
printf("What??\?!!!!....\n");
printf("What??" "?!!!!....\n);