如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)
Posted
技术标签:
【中文标题】如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)【英文标题】:How do I implement the sleep function in my for loop correctly? (Ubuntu) 【发布时间】:2019-09-07 00:03:10 【问题描述】:我试图让我的代码在屏幕上打印一些东西,然后等待 1 秒钟,然后绕过 for 循环并再次打印 21 次。当我在 Windows 中的 CodeBlocks 中使用#include 然后使用 Sleep(1000) 时,它可以工作。但是当我使用#include 和 sleep(1) 在我的 Ubuntu VM 上执行此操作时,所有内容都会从我的终端消失 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
替换为puts
。
投票结束:OP 承认他们提供的 MCVE 与他们正在解决的实际问题不同,提出新问题。引用 OP:I tried adding the fflush(stdout); like you suggested, but it doesn't work for my code - probably because I'm using mvprintw (from ncurses) instead of printf
【参考方案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',它也会起作用。
【讨论】:
【参考方案2】:printf
输出被缓冲 - 这意味着它不能保证立即出现在屏幕上。相反,它会在以下情况之一发生时出现:
printf
缓冲区,这就是您在屏幕上看到的内容
当缓冲区被程序员刷新时。
最后一种情况对您来说最有趣,有两种方法可以做到这一点 - 在您的字符串中包含 \n
(换行符)控制字符,例如
printf("Hello\n");
或调用fflush
获取标准输出流,例如
printf("Hello");
fflush(stdout);
【讨论】:
有没有办法使用另一个函数来实现同样的事情?我尝试按照您的建议添加fflush(stdout);
,但它不适用于我的代码 - 可能是因为我使用的是mvprintw
(来自ncurses)而不是printf
。我以为我可以应用相同的解决方案,但显然不行。有什么东西可以代替睡眠吗?
@Sawy3r 如果您的 MCVE 实际上是 MCVE,它将对您和回答您问题的人有很大帮助。您现在有两个答案,它们对它的面值提出了问题。我建议您使用正确的 MCVE 提出一个不同的问题。以上是关于如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中正确实现不同视图控制器之间的协议和委托?