You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:57:00