我正在尝试让我的代码在屏幕上打印一些内容,然后等待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;
}
在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',它也会起作用,我相信。
printf
输出被缓冲 - 这意味着,不能保证立即出现在屏幕上。相反,当出现以下情况之一时,它会出现:
printf
缓冲区,这就是你在屏幕上看到的最后一个案例对你来说最有意思,有两种方法可以做到这一点 - 在你的字符串中包含\n
(新行)控制字符,就像
printf("Hello\n");
或者将fflush
称为stdout流,例如
printf("Hello");
fflush(stdout);