C语言仅时间递增时更新计时显示无输出问题求解
问题根因
无输出的核心原因是标准输出的行缓冲机制:
当stdout对接终端时,默认采用行缓冲策略,缓冲区内容只有在遇到换行符\n、缓冲区存满、手动调用fflush、程序正常退出这几种场景下才会被真正刷到屏幕上。
修改后的代码里,printf只输出了回车符\r没有换行符,单次输出的内容长度远达不到缓冲区填满的阈值,执行完打印后内容一直滞留在缓冲区里,自然看不到任何输出。
最初的版本之所以能看到内容,是因为死循环无间隔疯狂调用printf,极短时间内就会把缓冲区写满触发自动刷新,所以能看到持续跳数的效果。
另外代码里还有个小隐患:判断差值和更新time_passed时分别调用了两次time(NULL),极端情况下两次调用刚好跨秒,会出现逻辑判断偏差,不过这个问题不会导致无输出。
修复方法
- 每次打印完成后手动调用
fflush(stdout),强制把缓冲区内容推送到终端 - 每个循环周期只读取一次当前时间,避免多次调用
time()产生的数值不一致问题 - (可选)打印
time_t类型值时显式转为unsigned long匹配%lu格式符,规避不同平台下time_t类型定义差异导致的打印异常
修复后的可运行代码:
#include <stdio.h> #include <time.h> int main() { time_t start_time = time(NULL); time_t target_seconds = 60 * 60 * 17; time_t time_passed = 0; // 可选方案:直接关闭stdout缓冲,后续就不用每次printf后调用fflush // setvbuf(stdout, NULL, _IONBF, 0); while (1) { time_t current = time(NULL); time_t delta = current - start_time; if (delta != time_passed) { time_passed = delta; printf("\rTime elapsed=%lu/%lu(seconds)", (unsigned long)time_passed, (unsigned long)target_seconds); fflush(stdout); // 核心修复:刷新输出缓冲区 } } return 0; }
内容的提问来源于stack exchange,提问作者kjhhgt76
相关产品推荐
相关产品推荐

