C语言公交座位预订程序登录失效与中途停滞问题排查
公交座位预订系统代码问题排查与修复
问题1:注册后登录始终提示“wrong sign-in details”
错误原因
- 换行符干扰字符串对比:注册时用
fprintf(fptr, "%s\n%s", name, pass);写入用户名和密码,会在每个字符串末尾添加换行符\n;但登录时用fgets读取会把换行符一并读入缓冲区,导致strcmp对比输入内容和文件内容时因换行符存在而不相等。 - 文件指针位置错误:登录分支中先执行了
ch=fgetc(fptr),将文件指针从起始位置移动到第一个字符之后,后续fgets读取的内容不是完整的用户名。 - 变量引用错误:登录成功提示里误用了未初始化的
name变量,应该使用用户输入的sign_name。
修复后的登录函数代码
void login(struct details array[], int number){ system("cls"); char name[20]={0}, pass[20]={0}, sign_name[20]={0}, sign_pass[20]={0}; int result_name, result_pass, option; FILE*fptr; printf("\t\tSelect a number:\n"); printf("\t\t 1. Register\n"); printf("\t\t 2. Sign in\n"); printf("Your choice: "); scanf("%d", &option); if(option==1){ fptr=fopen("Signin_details.txt", "w+"); printf("Username: "); fflush(stdin); gets(name); printf("Password: "); fflush(stdin); gets(pass); printf("You have successfully registered!"); fprintf(fptr, "%s\n%s", name, pass); fclose(fptr); printf("\nPress any key to continue ... "); getch(); bus(array, number); } if(option==2){ fptr=fopen("Signin_details.txt", "r"); if(fptr == NULL){ printf("\nPlease register yourself first\n"); getch(); return; } printf("Username: "); fflush(stdin); gets(sign_name); printf("Password: "); fflush(stdin); gets(sign_pass); char line[20]; // 读取用户名并去除末尾换行符 fgets(line, sizeof(line), fptr); line[strcspn(line, "\n")] = '\0'; result_name=strcmp(sign_name, line); // 读取密码并去除末尾换行符 fgets(line, sizeof(line), fptr); line[strcspn(line, "\n")] = '\0'; result_pass=strcmp(sign_pass, line); if(result_name==0 && result_pass==0) printf("\nWelcome user %s!", sign_name); while(result_pass!=0 || result_name!=0){ printf("\nWrong login details. Please enter them again.\n\n"); printf("Username: "); fflush(stdin); gets(sign_name); printf("Password: "); fflush(stdin); gets(sign_pass); rewind(fptr); fgets(line, sizeof(line), fptr); line[strcspn(line, "\n")] = '\0'; result_name=strcmp(sign_name, line); fgets(line, sizeof(line), fptr); line[strcspn(line, "\n")] = '\0'; result_pass=strcmp(sign_pass, line); } getch(); } if(fptr != NULL) fclose(fptr); }
问题2:录入首个公交编号后程序停滞
错误原因
- 文件指针误用:打印座位信息时错误使用了
fprintf(fptr, ...),但fptr是文件指针数组,应该使用当前公交对应的fptr[i]。 - 数组下标越界:座位数组
array[i].seat的下标范围是0-31,但循环中l从1开始递增到32,访问array[i].seat[l]会越界,触发未定义行为(程序崩溃或停滞)。 - 公交编号查重逻辑错误:原代码中文件查重的循环会重复读取同一行,导致死循环。
修复后的bus函数代码
void bus(struct details array[], int number){ int no; printf("Enter the number of buses you want to add: "); scanf("%d", &no); number+=no; int busno; FILE* fptr[no]; char buffer[6]; char string1[5], string2[5]; for(int i=0; i<no; i++){ printf("Enter the bus number: "); scanf("%d", &busno); sprintf(string1, "%d", busno); bptr=fopen("buses.txt", "a+"); // 检查当前数组中是否已有该公交编号 for(int j=0; j<i; j++){ if(busno==array[j].bus_number){ do{ printf("Bus data already exists. Enter another bus number: "); scanf("%d", &busno); sprintf(string1, "%d", busno); }while(busno==array[j].bus_number); break; } } // 检查文件中是否已有该公交编号 int exists_in_file; do{ exists_in_file = 0; rewind(bptr); while(fgets(string2, 5, bptr)){ string2[strcspn(string2, "\n")] = '\0'; if(strcmp(string1, string2)==0){ exists_in_file = 1; printf("Bus data already exists. Enter another bus number: "); scanf("%d", &busno); sprintf(string1, "%d", busno); break; } } }while(exists_in_file); fprintf(bptr, "%d\n", busno); fclose(bptr); array[i].bus_number=busno; sprintf(buffer, "%d.txt", busno); fptr[i]=fopen(buffer, "w+"); printf("Enter the bus driver's name: "); fflush(stdin); gets(array[i].busdriver); printf("Enter bus driver contact: "); scanf("%ld", &array[i].drivercontact); printf("Enter route of the bus: "); fflush(stdin); gets(array[i].route); fprintf(fptr[i],"Bus number: %d\tSemester fee: %d\t\tBus Driver contact number: %ld\t\tBus Driver: %s\t\tRoute: %s\n", busno, semester_fee, array[i].drivercontact, array[i].busdriver, array[i].route); // 初始化座位为Empty for(int n=0; n<32;n++){ strcpy(array[i].seat[n], "Empty"); } int l=0; for(int j=0; j<4; j++){ for(int k=0; k<8; k++){ fprintf(fptr[i], "\t%d. %s\t", l+1, array[i].seat[l]); l++; } fprintf(fptr[i], "\n"); } fclose(fptr[i]); } printf("Press any key to continue ... "); getch(); system("cls"); }
内容的提问来源于stack exchange,提问作者Coding
相关产品推荐
相关产品推荐

