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