在for循环中使用Printf和sleep?

3
我不明白以下代码为什么会这样工作。我的意思是,它并没有在每个一秒的延迟后打印“hello”...而是等待了5秒并一次性显示了hellohellohellohellohello
#include <stdio.h>

int i;
for(i=0; i<5; i++) {
   printf("hello");
   sleep(1);
}       

你需要以某种方式刷新标准输出。https://dev59.com/DXI-5IYBdhLWcg3wta1q - user824425
1
你没有在 main 函数中包含代码... 你真的编译并执行了吗? - Jay
5个回答

12
printf()的输出(stdout)默认情况下是行缓冲的,如果输出将要发送到终端tty。若要立即刷新缓冲区,需要使用以下命令之一:
printf("hello\n");

或者
printf("hello");
fflush(stdout);

后者每次迭代都会显式地刷新输出。

4

printf不会立即打印,而是将其按行缓存。

在字符串末尾添加"\n"(换行符)printf("hello\n");或使用write函数write(STDOUT_FILENO, "hello", sizeof("hello"));代替。


3

你正在写入标准输出(stdout),这是有缓存的。如果你想立即打印内容,你可以刷新输出或插入一个换行符。

你可以在字符串末尾添加一个\n来打印换行符 -- 将你的printf行更改为:

   printf("hello\n");

printf 后调用 fflush 来刷新 stdout 缓冲区:

#include <stdio.h>

int main() {
    int i;
    for(i=0; i<5; i++) {
       printf("hello");
       fflush(stdout);
       sleep(1);
    }       
}

2

通常输出可以被缓冲。这意味着实现会在实际写入控制台之前收集多个字节。您可以通过fflush(stdout)显式地写入缓冲区,这适用于所有文件描述符,其中之一是stdout,即终端输出。您可以使用setbuff(stdout,NULL)禁用缓冲,但从性能角度来看,这几乎永远不是一个好主意。


1

试试这个:

int i;
for(i=0;i<5;i++){
printf("hello\n");
i=0;
sleep(1);
}

1
请提供一条注释,解释为什么这会解决问题。 - Ryan Kohn
i=0; 重复写入“你好”5次的代码块。 - Jihed Ben taher
这样做不会产生预期的效果。它会导致循环永远运行(并在此过程中不断打印“Hello”)。原帖作者仍然希望它打印五次“Hello”,但每次之间有延迟。 - Ryan Kohn

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