Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么printf在无限循环之前不工作?_C_Loops_Io - Fatal编程技术网

C 为什么printf在无限循环之前不工作?

C 为什么printf在无限循环之前不工作?,c,loops,io,C,Loops,Io,我试图制作一个小程序,其中包含一个无限循环,以等待来自用户的信号输入。在开始无限循环之前,我想打印一条关于当前工作目录的消息。消息本身工作,但当我将无限循环放入代码中时,消息不会打印出来(但终端会无限循环)。代码是: #include <stdio.h> int MAX_PATH_LENGTH = 100; main () { char path[MAX_PATH_LENGTH]; getcwd(path, MAX_PATH_LENGTH); printf("%s&g

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

#include <stdio.h>

int MAX_PATH_LENGTH = 100;

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

为什么会这样?谢谢大家!

因为字符串末尾没有新行字符<默认情况下,code>stdout是行缓冲的,这意味着在遇到新行字符(
'\n'
)之前,或者在使用
fflush()

显式刷新之前,它不会刷新到控制台,因为stdout尚未刷新

召唤


在循环之前。

可能输出没有刷新。尝试:

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

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



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

因为输出未刷新。 加


在while循环解决问题之前。

相关:其他人已经回答了您的问题,但也应该注意,像这样的无限旋转循环不是正确的等待编程技术。它会让系统陷入困境,让你的风扇运转到最大,浪费你所有的电池寿命,甚至可能让守护进程飞出你的鼻子。(即将推出的C1x标准可能会允许编译器在无限循环中移动非IO代码,这可能会导致真正意想不到的事情…@R.)。。谢谢你的建议。还有其他技术可以推荐给我吗?你可能想从用户那里读取输入,所以你应该调用一个输入函数,比如
fgets
…是的,就是这样。如果希望不使用换行符,则fflush(stdout)将刷新等待换行符的缓冲数据,而不使用换行符。也可以更改控制台模式。谢谢您提供的信息。fflush()正是我所需要的,因为我想在用户给出输入之前避免使用新行。+1为flushing和这个特定程序提供了完整的解释。感谢您将您的答案放在我特定程序的上下文中,并感谢您提供了额外的信息!
fflush(stdout);
printf("%s> ", path);
fflush(stdout);
fflush(stdout);