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

