【问题标题】:Why does printf not work before infinite loop?为什么 printf 在无限循环之前不起作用?
【发布时间】:2011-09-22 01:42:50
【问题描述】:

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

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

这是为什么?谢谢!

【问题讨论】:

  • 其他人已经回答了你的问题,但也应该注意,像这样的无限自旋循环并不是等待的正确编程技术。它会使系统陷入僵局,将您的风扇调到最大,浪费您所有的电池寿命,甚至可能使守护进程飞出您的鼻子。 (即将推出的 C1x 标准可能会允许编译器在无限循环中移动非 IO 代码,这可能会导致真正意想不到的事情......)
  • @R.. 感谢您的建议。您还有其他技术可以推荐给我吗?
  • 你可能想从用户那里读取输入,所以你应该调用像fgets这样的输入函数...

标签: c loops io


【解决方案1】:

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


*正如我刚刚通过阅读评论中链接的问题 itsmatt 发现的那样,刷新换行仅在程序打印到终端时发生,而不一定在打印到文件时发生。

【讨论】:

  • +1 获取有关冲洗和此特定程序的完整说明。
  • 感谢您将您的答案放入我的特定程序的上下文中,并感谢您提供额外的信息!
【解决方案2】:

因为您的字符串末尾没有换行符。 stdout 默认是line-buffered,这意味着它不会刷新到控制台,直到它遇到换行符('\n'),或者直到你明确地用fflush()刷新它.

【讨论】:

  • 是的,就是这样。如果不希望有换行符, fflush(stdout) 将刷新等待换行符的缓冲数据,没有一个。也可以更改控制台模式。
  • 感谢您提供的信息。 fflush() 正是我需要的,因为我想在用户输入之前避免换行。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    因为标准输出还没有被刷新。

    打电话

    fflush(stdout);
    

    在你的循环之前。

    【讨论】:

      【解决方案5】:

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

      fflush(stdout); 
      

      之前的while循环会解决问题。

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 2021-09-08
        • 2023-03-14
        • 1970-01-01
        • 2021-07-01
        • 2013-05-30
        • 1970-01-01
        • 2018-03-17
        相关资源
        最近更新 更多