为什么在无限循环之前使用printf函数无法正常工作?

6

我正在尝试编写一个小程序,其中包括一个无限循环以等待用户的信号输入。在开始无限循环之前,我想打印出有关当前工作目录的消息。该消息本身可以正常工作,但是当我将无限循环放入代码中时,该消息不会打印出来(但终端确实会无限循环)。代码如下:

#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>

为什么会这样呢?谢谢!

相关链接:https://dev59.com/DXI-5IYBdhLWcg3wta1q - itsmatt
1
其他人已经回答了你的问题,但也应该注意到这种无限循环等待的编程技术不是正确的方法。它会拖累系统,让风扇运转到最大速度,浪费所有电池寿命,甚至可能让守护进程从鼻子里飞出来。(即将推出的 C1x 标准可能允许编译器在无限循环中移动非 IO 代码,这可能会导致一些非常意外的问题...) - R.. GitHub STOP HELPING ICE
@R.. 感谢您的建议。您还能推荐其他技巧给我吗? - A D
你可能想从用户那里读取输入,所以你应该调用一个像 fgets 这样的输入函数... - R.. GitHub STOP HELPING ICE
5个回答

9
当您调用printf时,输出不会立即打印出来;相反,它会进入某个缓冲区。为了真正将其显示在屏幕上,您必须调用fflush或类似的内容来刷新流。每当您打印换行符*并且程序终止时,这将自动为您完成;正是在删除无限循环时导致字符串显示的第二种情况。但是,在有循环的情况下,程序永远不会结束,因此输出永远不会被刷新到屏幕上,您将看不到任何内容。
*正如我刚刚从阅读itsmatt在评论中提供的问题中发现的那样,在程序打印到终端而不是文件时,换行符才会触发刷新。

对于刷新和这个特定程序的完整解释,请给予+1。 - flight
谢谢您将答案放入我的特定程序上下文中,并感谢提供额外的信息! - A D

3
由于您的字符串末尾没有换行符,因此 stdout 默认情况下是按行缓冲的,这意味着它不会刷新到控制台,直到遇到换行符 ('\n') 或者您使用 fflush() 显式刷新它。

是的,就是这样。如果不想要换行符,fflush(stdout)将刷新等待换行符但没有的缓冲数据。也可以尝试更改控制台模式。 - Chris Stratton
谢谢您提供的信息。fflush()正是我需要的,因为我想在用户输入之前避免换行。 - A D

2

可能是输出没有刷新。尝试使用以下命令:

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

1

因为标准输出没有被清空。

调用

fflush(stdout);

在你的循环之前。


1
因为输出没有被刷新。 请添加


fflush(stdout); 

在 while 循环之前解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接