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

C语言报告厅预订系统Switch分支后无法执行Step3输出问题

问题排查与修复方案

我帮你找出了代码里导致程序无法运行到Step3部分的几个关键问题,咱们一个个拆解:

1. 致命语法错误:空if语句

你在switch分支结束后写了一行if()——这是没有条件的空判断语句,直接会导致编译失败,程序根本没法走到后面的Step3代码。这应该是你写代码时不小心留下的冗余行,直接删掉就行。

2. scanf和fgets混用的输入缓冲区坑

当你用scanf("%i", ...)读取整数时,用户输入数字后按回车,scanf只会把数字读走,而换行符\n会留在输入缓冲区里。后面的fgets(booking_date, 20, stdin)会直接读取这个残留的换行符,看起来像是跳过了输入,但实际上fgets已经执行了,只是拿到了空内容。

解决办法很简单:每次用scanf读取完整数后,调用getchar()把缓冲区里的换行符清掉。

3. 类型不匹配的内存错误

在人数小于50的分支里,你定义了int lecture_room;,但却用strcpy(lecture_room, "XBK1");——strcpy是给字符数组复制字符串的,不能给int类型变量用,这会导致内存访问错误,轻则程序异常,重则直接崩溃。把lecture_room改成字符数组char lecture_room[20];就好了,和lecture_hall保持一致。


修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char applicant_name[100], applicant_faculty[100], applicant_date[40], applicant_id[50], applicant_mobile_number[20];
    int number_of_students, lecture_hall_book;
    char lecture_hall[20], lecture_room[20], booking_date[20]; // 修正lecture_room的类型

    printf("\n=======================================================================================\n");
    printf(" Author : Fathul Amin\n");
    printf(" Matric ID : CB19070\n");
    printf("=======================================================================================\n\n");
    printf(" Universiti Malaysia Pahang\n\n");
    printf(" Welcome to the Faculty of Computing (FCOM) Lecture Hall/Room Booking System\n\n");
    printf(" For your information, this system was created to support\n");
    printf(" government initiative to reduce paper usage by replacing the \n");
    printf(" manual application form to a computerized system \n\n\n");
    printf(" There will be 3 STEP to apply for a booking\n\n");
    printf("\t [STEP 1] Application Information\n");
    printf("\t [STEP 2] Determine Lecture Hall/Room based on Number of Students\n");
    printf("\t [STEP 3] Lecture Hall/Room Booking Date\n\n");
    printf("\t [STEP 4] Lecture Hall/Room Booking Time\n\n");
    printf("\n=======================================================================================");
    printf("\n [STEP 1] Below is an example of information needed");
    printf("\n=======================================================================================\n\n");
    printf(" APPLICANT INFORMATION\n\n");
    printf(" NAME : _____________ STAFF/STUDENT ID : ______________\n\n");
    printf(" FACULTY : _____________ MOBILE NUMBER : ______________\n\n");
    printf(" DATE : _____________ (xx/xx/xxxx)\n");
    printf("\n=======================================================================================\n\n");

    printf(" Enter Your Name : ");
    fgets(applicant_name, 100, stdin);
    printf(" Enter Your Faculty : ");
    fgets(applicant_faculty, 100, stdin);
    printf(" Enter Today's Date : ");
    fgets(applicant_date, 40, stdin);
    printf(" Enter Your Staff/Student ID : ");
    fgets(applicant_id, 50, stdin);
    printf(" Enter Your Mobile Number : ");
    fgets(applicant_mobile_number, 20, stdin);

    printf("\n\n=======================================================================================\n");
    printf(" [STEP 2] Number of Students");
    printf("\n=======================================================================================\n\n");
    printf("\t\t\t Enter Number of Students: ");
    scanf("%i", &number_of_students);
    getchar(); // 清空scanf留下的换行符

    printf("\n=======================================================================================\n\n");

    if(number_of_students > 50 && number_of_students<101){
        printf("\t\tLecture Hall : [1] YDK1\n");
        printf("\t\t\t\t[2] YDK2\n");
        printf("\t\t\t\t[3] YDK3\n");
        printf("\t\t\t\t[4] YDK4\n");
        printf("\t\t\t\t[5] YDK5\n\n");
        printf(" Which Lecture Hall do you want to book? (1-5): \n");
        scanf("%i", &lecture_hall_book);
        getchar(); // 清空换行符
        switch(lecture_hall_book){
            case 1 : printf("YDK1 Confirmed\n"); strcpy(lecture_hall, "YDK1"); break; // 修正了原代码里的字符串复制错误
            case 2 : printf("YDK2 Confirmed\n"); strcpy(lecture_hall, "YDK2"); break;
            case 3 : printf("YDK3 Confirmed\n"); strcpy(lecture_hall, "YDK3"); break;
            case 4 : printf("YDK4 Confirmed\n"); strcpy(lecture_hall, "YDK4"); break;
            case 5 : printf("YDK5 Confirmed\n"); strcpy(lecture_hall, "YDK5"); break;
            default: printf("Invalid selection!\n");
        }
    } else if(number_of_students<50) {
        printf("\t\t\tLecture Room : [1] XBK1\n");
        printf("\t\t\t\t\t [2] XBK2\n");
        printf("\t\t\t\t\t [3] XBK3\n");
        printf("\t\t\t\t\t [4] XBK4\n");
        printf("\t\t\t\t\t [5] XBK5\n");
        printf("\t\t\t\t\t [6] XBK6\n");
        printf("\t\t\t\t\t [7] XBK7\n");
        printf("\t\t\t\t\t [8] XBK8\n");
        printf("\t\t\t\t\t [9] XBK9\n");
        printf("\t\t\t\t\t[10] XBK10\n\n");
        printf(" Which Lecture Room do you want to book? (1-10): ");
        scanf("%i", &lecture_hall_book);
        getchar(); // 清空换行符
        switch(lecture_hall_book){
            case 1 : printf("\n\n\t\t\t\t XBK1 CONFIRMED\n"); strcpy(lecture_room, "XBK1"); break;
            case 2 : printf("\n\n\t\t\t\t XBK2 CONFIRMED\n"); strcpy(lecture_room, "XBK2"); break;
            case 3 : printf("\n\n\t\t\t\t XBK3 CONFIRMED\n"); strcpy(lecture_room, "XBK3"); break;
            case 4 : printf("\n\n\t\t\t\t XBK4 CONFIRMED\n"); strcpy(lecture_room, "XBK4"); break;
            case 5 : printf("\n\n\t\t\t\t XBK5 CONFIRMED\n"); strcpy(lecture_room, "XBK5"); break;
            case 6 : printf("\n\n\t\t\t\t XBK6 CONFIRMED\n"); strcpy(lecture_room, "XBK6"); break;
            case 7 : printf("\n\n\t\t\t\t XBK7 CONFIRMED\n"); strcpy(lecture_room, "XBK7"); break;
            case 8 : printf("\n\n\t\t\t\t XBK8 CONFIRMED\n"); strcpy(lecture_room, "XBK8"); break;
            case 9 : printf("\n\n\t\t\t\t XBK9 CONFIRMED\n"); strcpy(lecture_room, "XBK9"); break;
            case 10 : printf("\n\n\t\t\t\t XBK10 CONFIRMED\n"); strcpy(lecture_room, "XBK10"); break;
            default : printf("You didn't enter a valid option!\n");
        }
    } else {
        printf(" There is no Lecture Hall that can fit students more than 100\n");
        printf(" Maximum is 100 students for a lecture hall and 50 for a lecture room\n");
    }

    // 移除了原代码中的空if()语句
    printf("\n=======================================================================================\n\n");
    printf("\n [STEP 3] Lecture Hall/Room Booking Date");
    printf("\n=======================================================================================\n\n");
    printf(" Enter Booking Date: ");
    fgets(booking_date, 20, stdin);
    printf("\n\n=======================================================================================\n");
    printf(" [STEP 4] Lecture Hall/Room Booking Time");
    printf("\n=======================================================================================\n\n");
    printf("\n\t\t\t\tEXAMPLE (24 Hour Format)");
    printf("\n\t\t\t\t From : 0830");
    printf("\n\t\t\t\t To : 1030");
    printf("\n\t\t\t\t 08 ---> Hours In");
    printf("\n\t\t\t\t 30 ---> Minutes In"); // 修正了原注释的错误
    printf("\n\t\t\t\t 10 ---> Hours Out");
    printf("\n\t\t\t\t 30 ---> Minutes Out");
    return 0;
}

额外小修正

  • 我把你Lecture Hall分支里的字符串复制改对了(原代码选YDK1却复制XBK1,应该是笔误吧?)
  • 给每个switch加了default分支,处理用户输入无效选项的情况
  • 修正了Step4里的注释错误,原注释把分钟的说明写反了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:17:46