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

C语言时钟项目:小时切换后秒数末尾数字卡顿问题求助

问题分析

你的时钟在分钟进位到小时时,秒数末尾残留9的问题,根源是printf输出的数字没有固定宽度。比如之前秒数是两位(59),当重置为0时只输出一位0,控制台里原来的第二个字符9没被覆盖,就会显示成S: 09,直到秒数走到10(再次变成两位)才会把9覆盖掉。

另外代码逻辑里,当分钟满60进位时,已经在秒数满60的判断里把s重置过一次,这里再重复重置s属于冗余操作,但不是核心问题。

修复方案

给每个时间数字指定固定宽度,用%2d格式符,让输出的数字始终占两位(不足补空格),这样就能完全覆盖上一次的输出内容。同时调整代码顺序,让时间更新后再输出,逻辑更直观:

#include<stdio.h>
#include<Windows.h>

int main ()
{
    int h = 0, m = 59, s = 55;
    int prekid = 1;
    while (prekid == 1)
    {
        // 先更新时间
        s++;
        if (s == 60)
        {
            m++;
            s = 0;
        }
        if (m == 60)
        {
            m = 0;
            h++;
            // 无需重复重置s,秒数已在上方判断中重置
        }
        // 用%2d固定宽度,确保每次输出占两位,覆盖旧内容
        printf("\rH:%2d | M:%2d | S:%2d", h, m, s);
        fflush(stdout);
        Sleep(1000); // Windows API的Sleep首字母大写,参数为毫秒
    }
    return 0;
}
关键修改点
  • 使用%2d格式化输出:强制每个数字占两位,比如0会显示为 0,10显示为10,保证每次输出长度一致,不会残留旧字符。
  • 调整代码顺序:先更新时间再输出,逻辑更符合直觉(先计算新时间,再展示)。
  • 修正Sleep写法:Windows环境下的休眠函数是大写开头的Sleep,参数单位是毫秒(1000代表1秒),原代码的小写sleep(1)属于POSIX标准写法,在Windows下属于不规范兼容写法。

内容的提问来源于stack exchange,提问作者Gorgona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:50:26