【问题标题】:Printf and sleep inside for loop? [duplicate]Printf 并在 for 循环中休眠? [复制]
【发布时间】:2014-10-26 23:07:16
【问题描述】:

我不明白为什么下面的代码会这样工作..我的意思是:不是在每延迟一秒后打印“hello”...而是等待 5 秒并显示 hellohellohellohellohello一次。

#include <stdio.h>

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

【问题讨论】:

标签: c linux sleep


【解决方案1】:

printf() (stdout) 的输出如果输出到 tty,默认情况下是行缓冲的。你需要一个

printf("hello\n");

或

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

后者将在每次迭代时显式刷新输出。

【讨论】:

    【解决方案2】:

    printf 不会立即打印,而是逐行缓存。

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

    【讨论】:

      【解决方案3】:

      您正在写入标准输出 (stdout),这是缓冲。如果您希望立即打印内容,您可以刷新输出或插入换行符。

      您可以在字符串末尾添加\n 以打印换行符——将您的printf 行更改为:

         printf("hello\n");
      

      对于刷新stdout缓冲区调用fflush就可以了,在printf之后:

      #include <stdio.h>
      
      int main() {
          int i;
          for(i=0; i<5; i++) {
             printf("hello");
             fflush(stdout);
             sleep(1);
          }       
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          试试这个:

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

          【讨论】:

          • 请提供评论解释为什么这会解决问题。
          • i=0;阻止写“你好”5次。
          • 这不会产生预期的效果。它会导致循环永远运行(并在这样做时继续打印“Hello”)。 OP 仍然希望它打印“Hello”五次,但每次之间都有延迟。
          猜你喜欢
          • 1970-01-01
          • 2021-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-22
          • 1970-01-01
          相关资源
          最近更新 更多