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
相关产品推荐
相关产品推荐

