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

C语言公交座位预订程序登录失效与中途停滞问题排查

公交座位预订系统代码问题排查与修复

问题1:注册后登录始终提示“wrong sign-in details”

错误原因

  1. 换行符干扰字符串对比:注册时用fprintf(fptr, "%s\n%s", name, pass);写入用户名和密码,会在每个字符串末尾添加换行符\n;但登录时用fgets读取会把换行符一并读入缓冲区,导致strcmp对比输入内容和文件内容时因换行符存在而不相等。
  2. 文件指针位置错误:登录分支中先执行了ch=fgetc(fptr),将文件指针从起始位置移动到第一个字符之后,后续fgets读取的内容不是完整的用户名。
  3. 变量引用错误:登录成功提示里误用了未初始化的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:录入首个公交编号后程序停滞

错误原因

  1. 文件指针误用:打印座位信息时错误使用了fprintf(fptr, ...),但fptr是文件指针数组,应该使用当前公交对应的fptr[i]。
  2. 数组下标越界:座位数组array[i].seat的下标范围是0-31,但循环中l从1开始递增到32,访问array[i].seat[l]会越界,触发未定义行为(程序崩溃或停滞)。
  3. 公交编号查重逻辑错误:原代码中文件查重的循环会重复读取同一行,导致死循环。

修复后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:01:15