【发布时间】:2017-07-06 11:05:32
【问题描述】:
我构建了一个小程序,只需将文本从 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不允许这样做。出于某种原因,它使程序仅将输入传输到输出,“忽略”一切并非来自输入。我对么?如果是,为什么?
如果你对更详细的问题感兴趣,这里是汇编代码:
【问题讨论】:
-
另外,如果我没记错的话,在 C99 中引入了在
main()中省略显式return语句的权限,这意味着按照 C89 标准,您的程序会调用未定义的行为。跨度> -
@Worice 正如我所说,您可以通过在 unix 上按 CTRL+D 或在 Windows 上按 CTRL+Z 来从标准输入发出 EOF 信号以终止循环
-
@Worice 那么由于某种原因,输出缓冲区没有被刷新...
fflush(stdout);在printf()之后是否可以使用 io-redirection? -
@Worice 还是很奇怪,输出缓冲区应该在退出时隐式刷新!你究竟是如何编译和链接你的二进制文件的?
-
扔掉你正在编译的任何旧垃圾,并获得符合标准的 GCC 版本。您应该能够编译为
gcc -std=c11 -pedantic-errors -Wall -Wextra。除非您有非常特殊的要求,否则没有任何理由将您的代码编译为 GNU C/gnu90。