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

制作数字时钟:输入指定时间后分秒为何从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);

次要问题及优化

  1. 无效的延时循环:
    原代码中的延时逻辑for(double i=0;i<99999999;i++) {i++; i--;}完全无效——每次循环i先加1再减1,数值没有变化,会导致循环无限执行。建议使用Sleep(1000)(需包含<windows.h>头文件)实现标准的1秒延时,或者用系统相关的延时函数替代。

  2. 冗余/无效代码:

    • getch()位于goto start之后,永远不会被执行,属于无效代码,可删除。
    • 使用goto跳转循环的写法不够规范,建议用while(1)循环替代,逻辑更清晰。
  3. 时间显示不规范:
    原代码直接输出%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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:55:34