为什么printf在无限循环之前不起作用?

时间:2011-09-22 01:42:51

标签: c loops io

我正在尝试制作一个包含无限循环的小程序,以等待用户输入信号。我想在开始无限循环之前打印出关于当前工作目录的消息。该消息可以自行运行,但是当我将无限循环放入代码时,消息不会打印出来(但终端会无限循环)。代码是:

#include <stdio.h>

int MAX_PATH_LENGTH = 100;

main () {
  char path[MAX_PATH_LENGTH];
  getcwd(path, MAX_PATH_LENGTH);
  printf("%s> ", path);
  while(1) { }
}

如果我拿出while(1) { },我会得到输出:

ad@ubuntu:~/Documents$ ./a.out
/home/ad/Documents>

这是为什么?谢谢!

5 个答案:

答案 0 :(得分:4)

当您致电printf时,输出不会立即打印;相反,它会在幕后的某个地方进入缓冲区。为了实际让它显示在屏幕上,你必须调用fflush或类似的东西来刷新流。无论何时打印换行符*和程序终止时,都会自动完成此操作;这是第二种情况导致在删除无限循环时显示字符串。但是在那里有循环,程序永远不会结束,所以输出永远不会刷新到屏幕上,你什么都看不到。


*正如我刚刚通过阅读注释中链接的问题所发现的那样,只有在程序打印到终端时才会发生刷新换行,而不一定是在打印到文件时。

答案 1 :(得分:2)

因为字符串末尾没有换行符。默认情况下,stdout 行缓冲,这意味着它在遇到换行符('\n')之前不会刷新到控制台,或直到您明确刷新它与fflush()

答案 2 :(得分:1)

因为stdout尚未刷新。

呼叫

fflush(stdout);
在你的循环之前

答案 3 :(得分:1)

也许输出没有被刷新。尝试:

printf("%s> ", path);
fflush(stdout);

答案 4 :(得分:1)

因为输出未刷新。 添加

fflush(stdout); 
在while循环之前

将解决问题。