printf的不需要的输出

时间:2013-02-15 06:11:59

标签: c printf

我正在研究用于计算数据的遗留源代码。

为了调试几个错误条件,我在代码中添加了以下printf

printf("What???!!!!....\n");

日志保存在一个文件中,我正在搜索字符串“What ??? !!!! ....”但是我从未发现过这个,因为它的输出来自:

  

什么?| !!! ....

由于这种不必要的输出,我已经浪费了很多时间。 有人可以帮我确定原因吗?

3 个答案:

答案 0 :(得分:2)

输出与三字符有关, 字符串

  

...!对应于|

检查您的makefile是否为-trigraphs

确保现在有更明智的印刷品: - )

答案 1 :(得分:1)

在过去,键盘不一定包括编写C程序所需的所有字符。为了让那些没有合适键盘的人能够编程,最早版本的C编译器使用了三字符和有向图,不常见的两个或三个字符的组合可直接转换为可能缺少的键。以下是C:

的有向图和三字符列表

http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C

...!在列表中,它转换为|在预处理器中。

解决此问题的一种方法是在我上面链接的文章中:用\分隔问号,或者关闭字符串并在问号之间重新打开它。这可能是您的最佳选择,因为您正在使用遗留代码。

通常,您还可以使用编译器开关禁用有向图和三字符。有关这些详细信息,请参阅您的文档。

答案 2 :(得分:0)

在C中添加了

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);