在5秒后尝试重写同一行时,没有看到printf的初始输出

  • 本文关键字:printf 输出 一行 5秒 重写 c
  • 更新时间 :
  • 英文 :


我正试图从Ivor Horton's Beginning c的代码中复制。我无法得到代码期望的结果,因此我用我遇到问题的特定代码编写了一个较小的程序。

请参见第一个for环。它应该打印出两个随机数。如果我注释掉第二个for循环(它创建了大约5秒的延迟)和随后的printf("rHello)循环,我将看到两个随机数。然而,如果我取消第二个for循环和随后的printf的注释,我将永远不会看到两个随机数,只有输出Hello,即使for循环延迟printf("rHello")5秒。我想我可以看到两个随机数至少4秒左右,然后它们被printf("rHello")覆盖。有人能告诉我这是怎么回事吗?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>
int main(void) {
clock_t wait_start = 0;
time_t seed = 0;
unsigned int digits = 2;
unsigned int seconds = 5;

wait_start = clock();
srand((unsigned int) time(&seed));
for (unsigned int i = 1; i <= digits; ++i)
printf("%u ", rand() % 10);

// printf("%Lfn", ((long double)clock()) / CLOCKS_PER_SEC);
for (; clock() - wait_start < seconds * CLOCKS_PER_SEC; )
;
// printf("%Lfn", ((long double)clock()) / CLOCKS_PER_SEC);
printf("rHello");
return 0;
}
如果你知道你在寻找什么,建议的答案是好的。我的问题的标题非常直接地解释了我的代码中发生的事情。初学者可能不会搜索"flush";和"stdout buffer"。我没有搜索,也没有找到这个问题的解决方案。这是对这个问题的解决方案的补充,可以让初学者更好地理解。我的问题的解决方案给出了一个直接的解决方案,然后它是更多的信息,让我了解为什么我需要使用fflush

没有出现随机数字的原因是您没有将stdout流刷新到终端,并且由于您没有输出尾随换行符,因此它在流缓冲区中挂起,因为默认情况下stdout在附加到终端时通常是行缓冲的。

还需要注意的是,等待5秒钟的繁忙循环请求已消耗的CPU时间是浪费的。您应该在目标系统上使用sleep()系统调用或等效的调用(可能在Microsoft遗留系统上使用_sleep())。

修改后的版本:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#if defined _WIN32 || defined _WIN64
#include <windows.h>
#else
#include <unistd.h>
#endif
int main(void) {
int digits = 2;
int seconds = 5;

srand((unsigned int)time(NULL));
for (int i = 0; i < digits; i++) {
printf("%d ", rand() % 10);
}
fflush(stdout);
#if defined _WIN32 || defined _WIN64
Sleep(seconds * 1000UL);
#else
sleep(seconds);
#endif
printf("rHellon");
return 0;
}

最新更新