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

