Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在for循环中正确实现sleep函数?(Ubuntu)_C_Loops_For Loop_Sleep - Fatal编程技术网

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

C 如何在for循环中正确实现sleep函数?(Ubuntu),c,loops,for-loop,sleep,C,Loops,For Loop,Sleep,我试图让我的代码在屏幕上打印一些东西,然后等待1秒,然后绕过for循环,再打印21次。当我在Windows中使用#include然后Sleep(1000)以代码块的形式执行此操作时,它会起作用。但是当我在我的Ubuntu虚拟机上使用#include and sleep(1)时,我的终端上的所有东西都会消失21秒,然后立即出现。我想我用错了函数什么的 有什么想法吗 这是Ubuntu终端中的代码,它最终删除了我终端上的所有内容,等待21秒,然后只打印21次“Hello” #include <s

我试图让我的代码在屏幕上打印一些东西,然后等待1秒,然后绕过for循环,再打印21次。当我在Windows中使用#include然后Sleep(1000)以代码块的形式执行此操作时,它会起作用。但是当我在我的Ubuntu虚拟机上使用#include and sleep(1)时,我的终端上的所有东西都会消失21秒,然后立即出现。我想我用错了函数什么的

有什么想法吗

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

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

int main()

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

}
#包括
#包括
int main()
{
对于(int i=0;i<21;i++)
{
printf(“你好”);
睡眠(1);
}
}
这是Windows中的代码,它在21秒内每秒打印一次“Hello”,因此在21秒内在我的屏幕上打印21个Hello。这就是我在Ubuntu虚拟机中想要实现的

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

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

        return 0; 
    }
#包括
#包括
#包括
int main(){
对于(int i=0;i<21;i++)
{
printf(“你好”);
睡眠(1000);
}
返回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);           
    }

}
#包括
#包括
int main()
{
对于(int i=0;i<21;i++)
{
printf(“你好”);
fflush(stdout);
睡眠(1);
}
}

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

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

  • 当缓冲区变满时,-此时缓冲区的旧内容显示在屏幕上,缓冲区被清除为新输出的新内容-这称为缓冲区刷新
  • 当应用程序终止时-强制刷新所有
    printf
    缓冲区,这就是您在屏幕上看到的
  • 当程序员刷新缓冲区时
最后一个案例对您来说最有趣,有两种方法可以做到这一点-在字符串中包含
\n
(新行)控制字符,如

 printf("Hello\n");
或者调用stdout流的
fflush
,如

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

printf
替换为
put
。投票结束:OP承认他们提供的MCVE与他们正在解决的实际问题不同,建议新问题。引用OP:
我尝试添加fflush(stdout);正如您所建议的,但它不适用于我的代码-可能是因为我使用的是mvprintw(来自ncurses)而不是printf
,有没有办法使用其他函数来实现同样的功能?我尝试添加
fflush(stdout)如您所建议,但它不适用于我的代码-可能是因为我使用的是
mvprintw
(来自ncurses)而不是
printf
。我以为我可以应用相同的解决方案,但显然不行。还有什么东西可以代替睡眠吗?@Sawy3r如果你的MCVE实际上是MCVE,那么它将对你和回答你问题的人有巨大的帮助。你现在有两个答案,把你的问题带到了它的表面价值上。我建议你用适当的MCVE问一个不同的问题。