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

C语言学生信息管理程序搜索功能无法匹配已添加记录问题求助

解决学生信息管理程序中添加记录后无法搜索到的问题

我帮你排查了代码,发现核心问题出在add_student函数里——你打开了文件,但完全没有把输入的学生数据写入文件!这就导致你添加的记录根本没存在磁盘上,搜索自然找不到。另外还有几个小问题会影响程序稳定性,我一起帮你修复了。


核心问题分析

  1. 未写入文件:add_student中打开record.txt后,只完成了用户输入,没有调用fwrite将结构体数据写入文件,文件始终是空的,搜索时遍历不到任何记录。
  2. 不安全的输入函数:gets已经被C标准废弃,容易导致缓冲区溢出,存在安全隐患。
  3. 未定义行为的缓冲区清空:fflush(stdin)是未定义行为,不同编译器处理方式不一致,可能导致输入异常。
  4. 全局变量风险:使用全局的students结构体,容易在多函数调用时被意外覆盖数据。

修复方案与完整代码

下面是修复后的完整代码,我标注了关键修复点:

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

struct student {
    char name[20];
    char ID[20];
    int age;
    char course[20];
    int yrlvl;
};

// 安全清空输入缓冲区(替代fflush(stdin))
void clear_input_buffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

void add_student() {
    struct student new_student; // 用局部变量替代全局变量,避免数据冲突
    FILE *fp = fopen("record.txt", "ab"); // 用ab模式追加写入,更安全
    if (fp == NULL) {
        perror("Failed to open file");
        return;
    }

    printf("\nStudent Name: ");
    clear_input_buffer(); // 清空之前的输入残留
    fgets(new_student.name, sizeof(new_student.name), stdin);
    // 移除fgets读取的换行符,避免姓名中带换行
    new_student.name[strcspn(new_student.name, "\n")] = '\0';

    printf("\nStudent ID: ");
    scanf("%s", new_student.ID);

    printf("\nCourse: ");
    scanf("%s", new_student.course);

    printf("\nYear Level: ");
    scanf("%d", &new_student.yrlvl);

    printf("\nAge: ");
    scanf("%d", &new_student.age);

    // 关键修复:将学生数据写入文件
    fwrite(&new_student, sizeof(struct student), 1, fp);
    fclose(fp);
    printf("\nStudent record added successfully!\n");
}

void search_student() {
    char s_id[15];
    int isFound = 0;
    struct student temp_student; // 局部变量存储读取的记录

    printf("Enter Student ID to Search: ");
    clear_input_buffer();
    fgets(s_id, sizeof(s_id), stdin);
    s_id[strcspn(s_id, "\n")] = '\0'; // 移除换行符

    FILE *fp = fopen("record.txt", "rb");
    if (fp == NULL) {
        perror("Failed to open file");
        return;
    }

    while (fread(&temp_student, sizeof(struct student), 1, fp) == 1) {
        if (strcmp(s_id, temp_student.ID) == 0) {
            isFound = 1;
            break;
        }
    }

    if (isFound == 1) {
        printf("\nThe record is Found\n");
        printf("Student ID: %s\n", temp_student.ID);
        printf("Student Name: %s\n", temp_student.name);
        printf("Course: %s\n", temp_student.course);
        printf("Year Level: %d\n", temp_student.yrlvl);
        printf("Age: %d\n", temp_student.age);
    } else {
        printf("Sorry, No record found\n");
    }
    fclose(fp);
}

void Main_Menu() {
    int choice;
    while (1) {
        printf("\n=== Student Information Management System ===\n");
        printf("1. Add Student\n");
        printf("2. Edit Student Information\n");
        printf("3. View all Records\n");
        printf("4. Search Student\n");
        printf("5. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1: add_student(); break;
            case 2: 
                printf("Function not implemented yet\n");
                break;
            case 3: 
                printf("Function not implemented yet\n"); 
                break;
            case 4: search_student(); break;
            case 5: exit(0); break;
            default: printf("Invalid choice, please try again\n"); break;
        }
    }
}

int main() {
    Main_Menu();
    return 0;
}

测试验证

现在添加你说的测试记录(姓名Juan、ID为1、课程IT、年级1、年龄15)后,选择搜索功能输入ID“1”,就能得到你预期的输出:

The record is Found
Student ID: 1
Student Name: Juan
Course: IT
Year Level: 1
Age: 15

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:37:37