制作数字时钟:输入指定时间后分秒为何从0开始?
数字时钟代码错误分析与修复
核心错误:输入格式不匹配
你输入的时间格式是HH:MM:SS,但代码中的scanf("%d%d%d", &h, &m, &s)没有处理分隔符冒号。当输入22:23:32时,scanf仅能读取第一个数字22赋值给h,后续的:23:32会被判定为非数字输入,导致m和s始终保留初始值0,最终程序从22:0:0开始计时。
修复方案:将scanf的格式字符串修改为"%d:%d:%d",匹配带冒号的输入格式:
scanf("%d:%d:%d", &h, &m, &s);
次要问题及优化
无效的延时循环:
原代码中的延时逻辑for(double i=0;i<99999999;i++) {i++; i--;}完全无效——每次循环i先加1再减1,数值没有变化,会导致循环无限执行。建议使用Sleep(1000)(需包含<windows.h>头文件)实现标准的1秒延时,或者用系统相关的延时函数替代。冗余/无效代码:
getch()位于goto start之后,永远不会被执行,属于无效代码,可删除。- 使用
goto跳转循环的写法不够规范,建议用while(1)循环替代,逻辑更清晰。
时间显示不规范:
原代码直接输出%d:%d:%d,当数字小于10时会显示成22:3:2这类格式,可改为%02d:%02d:%02d实现补零显示,更符合时钟的常规样式。
修复后完整代码示例
#include<stdio.h> #include<stdlib.h> #include<windows.h> int main () { int h=0, m=0, s=0; system("cls"); printf("Please enter a time format in HH:MM:SS\n"); scanf("%d:%d:%d", &h, &m, &s); // 校验输入时间的合法性 if(h < 0 || h >=24 || m <0 || m >=60 || s <0 || s >=60) { printf("Invalid time format!\n"); return 1; } while(1) { system("cls"); printf(" %02d:%02d:%02d", h, m, s); printf(h < 12 ? " AM" : " PM"); Sleep(1000); s++; if(s >= 60) { s = 0; m++; if(m >=60) { m =0; h++; h %=24; } } } return 0; }
内容的提问来源于stack exchange,提问作者Sidra B
相关产品推荐
相关产品推荐

