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

问题描述 投票:2回答:2

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

有任何想法吗?

这是Ubuntu终端中的代码,它最终删除了终端上的所有内容,等待21秒,然后只打印“Hello”21次。

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

int main()

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

}

这是Windows中的代码,每秒打印“Hello”21秒,因此在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; 
    }
c loops for-loop sleep
2个回答
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
投票

printf输出被缓冲 - 这意味着,不能保证立即出现在屏幕上。相反,当出现以下情况之一时,它会出现:

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

最后一个案例对你来说最有意思,有两种方法可以做到这一点 - 在你的字符串中包含\n(新行)控制字符,就像

 printf("Hello\n");

或者将fflush称为stdout流,例如

 printf("Hello");
 fflush(stdout);
© www.soinside.com 2019 - 2024. All rights reserved.