我构建了一个小程序,该程序仅将文本从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和标准输出。

我在想:


单独使用命令./myCopier.exe显然会产生无限循环。如果没有输入文本,则不会有EOL字符,因此将永远无法到达print()命令。
那么,为什么在提供输入时printf()命令没有明显效果?我希望printf()中的文本出现在标准输出中,就在循环关闭并创建output.txt时。为什么不发生?
我的理论是./myCopier.txt < rand.txt > randout.txt不允许它。由于某种原因,它使程序仅将输入传输到输出,“忽略”所有并非来自输入的内容。我对么?如果是这样,为什么?


如果您对更详细的问题感兴趣,请参见以下汇编代码:

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

最佳答案

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

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


尝试按C90的要求在main()的末尾添加return 0。否则,c90 / gnu90模式下的GCC会警告您:“控制到达非空函数的末尾”。
尝试添加fflush(stdout);

07-28 04:33
查看更多