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

C语言闹钟程序while循环无法输出首个输入时间该如何解决?

问题核心原因

你代码的逻辑是先对时间做加1操作,再打印时间,自然会跳过初始的输入时间:

  • 初始拆分得到的输入时间(比如示例中的23:59:58)从来没有机会被打印,进入循环第一步就是present_second++变成23:59:59之后才执行printf,所以第一行输出就是加1后的结果。
  • 另外还有两个隐藏问题:
    • 你定义了全局的时间变量,但input_time的参数是同名局部变量,你在input_time里修改的是局部值,不会同步到全局变量,只是因为你在input_time里主动调用了update_time传参,这个问题才暂时没触发
    • 你在main和input_time里重复调用了update_time,会导致逻辑执行两次
    • 三层while循环逻辑冗余,重复代码多容易出问题

修复方案

调整循环内的执行顺序:先判断是否到闹钟时间,没到就先打印当前时间,再做加1操作,同时可以把三层循环合并为一层,简化逻辑。

修正后的完整参考代码

#include <stdio.h>

// 可以删掉没用的全局变量,避免命名冲突
void input_time(int *present_time, int *time_for_alarm);
void update_time(int present_time, int time_for_alarm);

int main()
{
    int present_time, time_for_alarm;
    input_time(&present_time, &time_for_alarm);
    update_time(present_time, time_for_alarm);
    return 0;
}

// 改为传指针修改外部变量,避免局部变量不生效的问题
void input_time(int *present_time, int *time_for_alarm)  
{                                                     
    printf("What time is it now? (HHMMSS) \n");
    scanf("%d", present_time);
    while(*present_time > 235959 || *present_time < 0){
        printf("Invalid time. What time is it now? (HHMMSS) \n");
        scanf("%d", present_time);
    }
    
    printf("When should the alarm go? (HHMMSS) \n");
    scanf("%d", time_for_alarm);
    while(*time_for_alarm > 235959 || *time_for_alarm < 0){ 
        printf("Invalid time. When should the alarm go? \n");
        scanf("%d", time_for_alarm);
    }
    
    printf("________ \n");
}

void update_time(int present_time, int time_for_alarm)
{   
    int present_hour = present_time/10000;
    int present_minute = (present_time/100)%100;
    int present_second = present_time%100; 
    int alarm_hour = time_for_alarm/10000;
    int alarm_minute = (time_for_alarm/100)%100;
    int alarm_second = time_for_alarm%100;

    while(1) {
        // 先判断是否触发闹钟
        if(present_hour == alarm_hour && present_minute == alarm_minute && present_second == alarm_second) {
            printf("ALARM");
            break;
        }
        // 没触发就先打印当前时间
        printf("%02d:%02d:%02d \n", present_hour, present_minute, present_second);
        // 再做时间加1操作
        present_second++;
        if(present_second == 60) {
            present_second = 0;
            present_minute++;
        }
        if(present_minute == 60) {
            present_minute = 0;
            present_hour++;
        }
        if(present_hour == 24) {
            present_hour = 0;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:27:01