如何正确地实现for循环中的睡眠函数?(Ubuntu)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我正在尝试让我的代码在屏幕上打印一些内容,然后等待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; 
    }
提问于
用户回答回答于

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

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

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

 printf("Hello\n");

或者调用fflushstdout流,比如

 printf("Hello");
 fflush(stdout);
用户回答回答于

在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',它也会起作用,我相信。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励