隐藏的可打印文本

时间:2017-07-06 11:05:33

标签: c c89

我构建了一个小程序,只需将文本从input.txt文件复制到output.txt文件即可。它对命令没有明显的问题:

./myCopier.txt < rand.txt > randout.txt

在GCC89编译器上,用于教学目的。

#include<stdio.h>

int main(void){
        int c;

        while ((c = getchar()) != EOF)
                putchar(c);

        /*The text in printf() does not appear anywhere*/

        printf("My theories and toughts!\n");
}

稍后,我添加printf()以打印我对该程序如何工作的想法。即使使用限制性参数(-Wall),它也会编译时没有错误或警告,但此文本不会出现在任何地方。在任何地方,我的意思是output.txt和标准输出。

我在想:

  1. 单独使用命令./myCopier.exe可以创建无限循环。如果没有文本输入,则没有EOL个字符,因此永远不会到达print()命令。
  2. 那么,为什么在提供输入时,printf()命令没有明显效果?我希望printf()的文本出现在标准输出上,就在循环关闭并创建output.txt时。为什么不会发生?
  3. 我的理论是./myCopier.txt < rand.txt > randout.txt不允许它。由于某种原因,它使程序只将输入传输到输出,&#34;忽略&#34;一切都不是来自输入。我对么?如果是这样,为什么?
  4. 如果您对更深入细节的问题感兴趣,请参阅汇编代码:

    http://text-share.com/view/79f31f38

1 个答案:

答案 0 :(得分:3)

省略main()中的return语句会导致C89 / C90中的未定义行为。

通常,从main()返回会强制刷新输出缓冲区。如果省略return语句,则可能发生任何事情。

  • 尝试在main()的末尾添加return 0,如C90所示。在c90 / gnu90模式下的GCC会警告你:“控制到达无效功能的结束”。
  • 尝试添加fflush(stdout);