如何实现用户输入错误时让代码跳转至指定位置循环执行?
实现输入错误时的循环跳转功能
针对你提供的航班管理代码片段,我来帮你实现输入错误时回到指定位置重新输入的功能。主要分两大场景处理:菜单选项输入错误、航班信息(日期、时间、编号等)输入错误。
核心思路
- 对于菜单选项输入:如果用户输入非数字、或不在有效范围内,清空输入缓冲区,提示错误后回到菜单重新选择。
- 对于航班信息输入:如果输入的日期/时间无效、航班号/城市代码长度超标,提示错误后跳转到对应输入步骤重新输入。
修改后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> // 用于清理输入缓冲区 // 补充原代码缺失的宏和结构体定义 #define MAX_FLIGHTCODE_LEN 6 #define MAX_CITYCODE_LEN 3 #define MAX_NUM_FLIGHTS 100 typedef struct { char flight_code[MAX_FLIGHTCODE_LEN + 1]; char arrival_city[MAX_CITYCODE_LEN + 1]; int dep_month, dep_day, dep_hour, dep_min; int arr_month, arr_day, arr_hour, arr_min; } flight_t; // 辅助函数:清空输入缓冲区,避免残留字符干扰后续输入 void clear_input_buffer() { while (getchar() != '\n'); // 读取直到换行符,清空所有残留内容 } int main() { int choice; flight_t flights[MAX_NUM_FLIGHTS]; int flight_count = 0; // 记录已添加的航班数量 do { // 打印功能菜单 printf("\n===== 航班管理系统 =====\n"); printf("1. 添加航班\n"); printf("2. 显示指定目的地的所有航班\n"); printf("3. 保存航班到数据库文件\n"); printf("4. 从文件加载航班\n"); printf("5. 退出系统\n"); printf("请输入你的选择(1-5): "); // 处理菜单选项输入错误 if (scanf("%d", &choice) != 1 || choice < 1 || choice > 5) { clear_input_buffer(); // 清空缓冲区里的无效输入(比如字母、符号) printf("❌ 输入错误!请输入1-5之间的数字。\n"); continue; // 回到循环开头,重新显示菜单 } switch (choice) { case 1: { if (flight_count >= MAX_NUM_FLIGHTS) { printf("⚠️ 航班数量已达上限,无法添加新航班。\n"); break; } flight_t new_flight; // 输入航班号,处理长度超限问题 input_flight_code: // 跳转标记,用于重新输入 printf("请输入航班号(最多%d位): ", MAX_FLIGHTCODE_LEN); scanf("%s", new_flight.flight_code); if (strlen(new_flight.flight_code) > MAX_FLIGHTCODE_LEN) { printf("❌ 航班号过长!最多只能输入%d位。\n", MAX_FLIGHTCODE_LEN); goto input_flight_code; // 跳转到航班号输入步骤 } // 输入到达城市代码,处理长度超限问题 input_city_code: printf("请输入到达城市代码(最多%d位): ", MAX_CITYCODE_LEN); scanf("%s", new_flight.arrival_city); if (strlen(new_flight.arrival_city) > MAX_CITYCODE_LEN) { printf("❌ 城市代码过长!最多只能输入%d位。\n", MAX_CITYCODE_LEN); goto input_city_code; } // 输入出发日期,处理无效日期 input_dep_date: printf("请输入出发日期(月 日): "); if (scanf("%d %d", &new_flight.dep_month, &new_flight.dep_day) != 2 || new_flight.dep_month < 1 || new_flight.dep_month > 12 || new_flight.dep_day < 1 || new_flight.dep_day > 31) { // 可优化为判断每月实际天数,先简化处理 clear_input_buffer(); printf("❌ 日期无效!请输入1-12的月份和1-31的日期。\n"); goto input_dep_date; } // 输入出发时间,处理无效时间 input_dep_time: printf("请输入出发时间(小时 分钟): "); if (scanf("%d %d", &new_flight.dep_hour, &new_flight.dep_min) != 2 || new_flight.dep_hour < 0 || new_flight.dep_hour > 23 || new_flight.dep_min < 0 || new_flight.dep_min > 59) { clear_input_buffer(); printf("❌ 时间无效!请输入0-23的小时和0-59的分钟。\n"); goto input_dep_time; } // 输入到达日期(逻辑同出发日期) input_arr_date: printf("请输入到达日期(月 日): "); if (scanf("%d %d", &new_flight.arr_month, &new_flight.arr_day) != 2 || new_flight.arr_month < 1 || new_flight.arr_month > 12 || new_flight.arr_day < 1 || new_flight.arr_day > 31) { clear_input_buffer(); printf("❌ 日期无效!请重新输入。\n"); goto input_arr_date; } // 输入到达时间(逻辑同出发时间) input_arr_time: printf("请输入到达时间(小时 分钟): "); if (scanf("%d %d", &new_flight.arr_hour, &new_flight.arr_min) != 2 || new_flight.arr_hour < 0 || new_flight.arr_hour > 23 || new_flight.arr_min < 0 || new_flight.arr_min > 59) { clear_input_buffer(); printf("❌ 时间无效!请重新输入。\n"); goto input_arr_time; } // 将新航班添加到数组 flights[flight_count++] = new_flight; printf("✅ 航班添加成功!\n"); break; } case 2: printf("显示指定目的地航班功能待实现。\n"); break; case 3: printf("保存航班到文件功能待实现。\n"); break; case 4: printf("从文件加载航班功能待实现。\n"); break; case 5: printf("退出系统,再见!\n"); break; } } while (choice != 5); return 0; }
关键细节说明
- 输入缓冲区清理:用
clear_input_buffer()函数解决输入错误后残留字符干扰后续输入的问题,比如用户输入字母后,这些字符会留在缓冲区,导致后续scanf直接读取无效内容。 - 菜单输入错误处理:通过判断
scanf的返回值(成功读取的变量数量)和选项范围,用continue直接回到循环开头,重新显示菜单。 - 航班信息输入跳转:用
goto语句跳转到对应输入步骤的标记,这种场景下goto是合理的,避免了嵌套循环导致的代码冗余和逻辑混乱。 - 边界检查:对航班号、城市代码的长度,日期时间的合法范围做了基础校验,你可以根据需求进一步优化(比如判断每个月的实际天数)。
内容的提问来源于stack exchange,提问作者user9719237
相关产品推荐
相关产品推荐

