我构建了一个小程序,该程序仅将文本从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);
。