C语言while循环制作时钟如何不重复打印文本仅更新数值
C语言动态更新时钟修改方案
原有代码存在的问题
- 计时逻辑错误:分、秒满60就需要进位,原有代码判断
s>60才进位会多走1秒,且小时最大值应为23而非60 - 无延时逻辑:无限循环无等待会占满CPU资源,更新速度远快于实际1秒的间隔
- 打印逻辑问题:每次打印带换行符会把旧内容向上顶,无法实现原位更新数值
核心实现思路
利用终端ANSI转义序列控制光标位置,每次更新时把光标移回第一行开头,覆盖打印新的数值即可,无需重复输出整段文本,同时配合延时函数实现秒级更新。
修改后完整代码
#include <stdio.h> // 跨平台延时逻辑适配 #ifdef _WIN32 #include <windows.h> #define DELAY_SECOND() Sleep(1000) #else #include <unistd.h> #define DELAY_SECOND() sleep(1) #endif int run_clock(int h,int m,int s){ // 修正参数校验规则,符合实际时钟范围 if(h >= 0 && h < 24 && m >=0 && m < 60 && s >=0 && s < 60){ // 首次打印时钟内容 printf("Hour => %d\nMinute => %d\nSecond => %d", h, m, s); fflush(stdout); // 强制刷新缓冲区,确保内容立刻显示 while(1){ DELAY_SECOND(); // 等待1秒 s++; // 修正进位逻辑 if(s >= 60){ m++; s = 0; } if(m >= 60){ h++; m = 0; } if(h >= 24){ h = 0; } // \033[3F 表示光标向上移动3行,\r表示回到当前行开头 // 数值后加空格是为了覆盖之前残留的长数字字符 printf("\033[3F\rHour => %d \nMinute => %d \nSecond => %d ", h, m, s); fflush(stdout); } } return 0; } int main(){ int h,m,s; printf("Enter an hour: \n"); scanf("%d", &h); printf("Enter minutes: \n"); scanf("%d", &m); printf("Enter seconds: \n"); scanf("%d", &s); run_clock(h,m,s); return 0; }
注:Windows系统下如果旧终端不显示转义序列,可以在main函数开头加一句
system("");开启ANSI转义支持,Win10及以上版本系统默认已支持。
内容的提问来源于stack exchange,提问作者salluc 1
相关产品推荐
相关产品推荐

