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

如何实现用户输入错误时让代码跳转至指定位置循环执行?

实现输入错误时的循环跳转功能

针对你提供的航班管理代码片段,我来帮你实现输入错误时回到指定位置重新输入的功能。主要分两大场景处理:菜单选项输入错误、航班信息(日期、时间、编号等)输入错误。

核心思路

  • 对于菜单选项输入:如果用户输入非数字、或不在有效范围内,清空输入缓冲区,提示错误后回到菜单重新选择。
  • 对于航班信息输入:如果输入的日期/时间无效、航班号/城市代码长度超标,提示错误后跳转到对应输入步骤重新输入。

修改后的完整代码

#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;
}

关键细节说明

  1. 输入缓冲区清理:用clear_input_buffer()函数解决输入错误后残留字符干扰后续输入的问题,比如用户输入字母后,这些字符会留在缓冲区,导致后续scanf直接读取无效内容。
  2. 菜单输入错误处理:通过判断scanf的返回值(成功读取的变量数量)和选项范围,用continue直接回到循环开头,重新显示菜单。
  3. 航班信息输入跳转:用goto语句跳转到对应输入步骤的标记,这种场景下goto是合理的,避免了嵌套循环导致的代码冗余和逻辑混乱。
  4. 边界检查:对航班号、城市代码的长度,日期时间的合法范围做了基础校验,你可以根据需求进一步优化(比如判断每个月的实际天数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:53