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

在C语言中能否实现数组连续追加学生记录?

需求可行性分析与实现方案

你的需求完全可行,核心问题是原代码的学生数组是局部变量,每次调用Add_Student时创建的数组会在函数执行结束后被销毁,导致之前的数据无法保留。要实现累计存储,需要改用动态内存分配来管理学生数据,同时跟踪当前已存储的学生总数。

修改思路

  • 定义全局变量(或通过指针传递)保存动态分配的学生数组指针,以及当前已有的学生数量。
  • 每次添加学生时,用realloc扩展数组内存空间,将新数据追加到已有数据之后。
  • 程序退出前释放已分配的内存,避免内存泄漏。

修改后的示例代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 引入动态内存分配相关头文件

typedef struct
{
    int dd;
    int mm;
    int yy;
}DATE;

typedef struct
{
    char name[20];
    int ID;
    DATE DOB;
    char course[20];
    int yrlvl;
}Student;

// 全局变量:保存学生数组指针和当前已存储的学生数量
Student *students = NULL;
int current_count = 0;

void Main_Actions();
void Add_Student();

int main()
{
    Main_Actions();
    // 程序退出前释放动态分配的内存
    if(students != NULL)
        free(students);
    return 0;
}

void Main_Actions()
{
    char  *arr_Actions[] = {"default","Add Student","Edit Student Information","View all Records","Search Student","Exit","\0"};
    int choice_Actions;
    int loop_Actions;
    printf("\n ========= Actions =========\n");
    for(loop_Actions = 1; loop_Actions < 6; loop_Actions++)
    {
        printf("[%d]\t",loop_Actions);
        printf(arr_Actions[loop_Actions]);
        printf("\n");
    }
    printf("==============================");
    printf("\n Choice: ");
    scanf("%d",&choice_Actions);

    switch(choice_Actions)
    {
        case 1:
            Add_Student();
            break;
        case 5: // 处理退出逻辑
            printf("Exiting program...");
            return;
        default:
            printf("\n Invalid input!");
            Main_Actions(); // 输入错误后返回菜单
            break;
    }
}

void Add_Student()
{
    int add_count;

    printf("\n Enter the number of students to add: ");
    scanf("%d",&add_count);
    system("cls");

    // 扩展内存:原有学生数量 + 新增数量
    Student *temp = realloc(students, sizeof(Student) * (current_count + add_count));
    if(temp == NULL) // 检查内存分配是否成功
    {
        printf("Memory allocation failed!\n");
        Main_Actions();
        return;
    }
    students = temp; // 更新数组指针

    // 录入新学生数据,从当前已有学生的末尾开始
    for(int i = current_count; i < current_count + add_count; i++)
    {
        printf("================================\n");
        printf("=========== STUDENT [%d]=========\n", i + 1);
        printf("================================\n");

        printf("\n Student ID Number: ");
        scanf("%d", &students[i].ID);

        printf("\n Student Name: ");
        scanf("%s", students[i].name); // 数组名本身是指针,无需加&

        printf("\n Student Course: ");
        scanf("%s", students[i].course);

        printf("\n Student Year Level: ");
        scanf("%d", &students[i].yrlvl);

        printf("\n Student Birthday: ");
        printf("\n Month: ");
        scanf("%d", &students[i].DOB.mm);
        printf("\n Day: ");
        scanf("%d", &students[i].DOB.dd);
        printf("\n Year: ");
        scanf("%d", &students[i].DOB.yy);
        system("cls");
    }

    current_count += add_count; // 更新当前学生总数

    // 打印所有已存储的学生数据
    printf("All stored students:\n");
    printf("ID\tName\tCourse\tYear Level\n");
    for(int j = 0; j < current_count; j++ )
    {
        printf("%d\t%s\t%s\t%d\n",
               students[j].ID, students[j].name, students[j].course, students[j].yrlvl);
    }
    Main_Actions();
}

关键改动说明

  • 新增全局变量students和current_count,实现跨函数的数据持久化。
  • 使用realloc动态扩展内存,确保原有数据不丢失,同时为新学生分配空间。
  • 修复原代码中scanf("%s",&students[i].name)的错误(数组名本身是指针,不需要取地址符&)。
  • 增加内存分配失败的判断逻辑,避免程序崩溃。
  • 完善退出选项的处理,避免无限递归调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:30:24