如何在我的for循环中正确实现sleep函数? (Ubuntu)

时间:2019-04-16 19:56:21

标签: c loops for-loop sleep

我正在尝试让我的代码在屏幕上打印一些东西,然后等待1秒钟,然后绕过for循环并再次打印21次。当我在Windows中使用#include然后使用Sleep(1000)在CodeBlocks中执行此操作时,它将起作用。但是,当我使用#include和sleep(1)在Ubuntu VM上执行此操作时,所有内容将从我的终端消失21秒钟,然后所有内容立即出现。我想我使用了错误的功能或其他功能。

有什么想法吗?

这是Ubuntu终端中的代码,该代码最终删除了终端上已经存在的所有内容,等待21秒,然后只打印21次。

#include <stdio.h>
#include <unistd.h>

int main()

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

}

这是Windows中每秒21秒打印一次“ Hello”的代码,因此在21秒内在我的屏幕上打印21个Hello。这是我要在我的Ubuntu VM中实现的目标。

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>

    int main() {
        for (int i = 0; i < 21; i++)
        {
            printf("Hello");
            Sleep(1000);
        }

        return 0; 
    }

2 个答案:

答案 0 :(得分:1)

在UNIX中,进程流缓冲区-它们累积I / O,并且默认情况下不会在写入时立即“刷新”到基础设备。所以-您需要冲洗流:

#include <stdio.h>
#include <unistd.h>

int main()

{
    for (int i = 0; i < 21; i++)
    {
        printf("Hello");
        fflush(stdout);
        sleep(1);           
    }

}

我相信,如果您在“ Hello”之后输出换行符'\ n',它也会起作用。

答案 1 :(得分:1)

printf输出被缓冲-这意味着不能保证它立即显示在屏幕上。而是出现以下情况之一时出现:

  • 当缓冲区已满时-在屏幕上显示缓冲区的旧内容,并为新的输出清除缓冲区-这称为缓冲区刷新
  • 应用程序终止时-强制刷新所有printf缓冲区,这就是您在屏幕上看到的内容
  • 程序员清除缓冲区时。

最后一种情况对您来说最有趣,您可以通过两种方式执行此操作-要么在字符串中包含\n(换行)控制字符,例如

 printf("Hello\n");

或调用fflush以获得标准输出流,例如

 printf("Hello");
 fflush(stdout);