隐藏的可打印文本

Hidden printable text

我构建了一个小程序,只需将文本从 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不允许。由于某种原因,它使得程序只将输入传输到输出,"ignoring" 一切都不是来自输入。我对么?如果是,为什么?

如果您对问题更深入的细节感兴趣,这里是汇编代码:

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

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

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

  • 尝试按照 C90 的要求在 main() 的末尾添加 return 0。 c90/gnu90 模式下的 GCC 将以其他方式警告您:"control reaches end of non-void function".
  • 尝试添加 fflush(stdout);.