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

将输入存入结构体后排序打印出现编译错误,请求解决

编译错误排查与修复方案

错误1:Pupils[i].DM213[i] 下标使用错误

  • 原因:结构体Pupil中DM213是单个int变量,并非数组或指针,不能通过下标[i]访问。
  • 修复:将Pupils[i].DM213[i]修改为Pupils[i].DM213。

错误2:compare 标识符未声明

  • 原因:qsort需要传入自定义比较函数,但代码中未定义/声明该函数,同时缺少qsort依赖的头文件<stdlib.h>。
  • 修复:
    1. 在代码开头添加头文件引用:#include <stdlib.h>和#include <string.h>(字符串比较需用到strcmp);
    2. 在main函数外定义compare函数,实现按姓氏字母排序:
    int compare(const void *a, const void *b) {
        const struct Pupil *p1 = (const struct Pupil *)a;
        const struct Pupil *p2 = (const struct Pupil *)b;
        return strcmp(p1->Lastnames, p2->Lastnames);
    }
    
    1. 将结构体Pupil的定义移到main函数外,确保compare函数能访问该类型。

额外逻辑/语法问题修复

除编译错误外,代码还有几处需调整的问题:

  • qsort被放在读取文件的循环内部,应在所有学生数据读取完成后再调用排序;
  • 最终printf的参数位置错误,格式符与变量不匹配,且整数除法会丢失精度,建议改为浮点数计算后转整数;
  • 未检查fopen是否成功,文件不存在时会导致程序崩溃;
  • 打印时Pupils[PupilAmount]存在数组越界,需改为Pupils[i]并展开对应成员变量。

完整修正代码

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

// 结构体全局定义,方便比较函数访问
struct Pupil {
    char Lastnames[20];
    int DM210;
    int DM211;
    int DM212;
    int DM213;
    int DM214;
    int DM215;
};

// qsort比较函数:按姓氏字母升序排序
int compare(const void *a, const void *b) {
    const struct Pupil *p1 = (const struct Pupil *)a;
    const struct Pupil *p2 = (const struct Pupil *)b;
    return strcmp(p1->Lastnames, p2->Lastnames);
}

int main(void) {
    int PupilAmount;
    printf("How many Pupils would you like to input?\n");
    scanf("%d", &PupilAmount);

    int arr[PupilAmount];
    printf("Would you like to read from a file? (y/n)\n");
    char input;
    scanf(" %c", &input);
    
    if (input == 'y') {
        FILE *fp = fopen("input.txt", "r");
        // 检查文件是否成功打开
        if (!fp) {
            perror("Failed to open file");
            return 1;
        }

        struct Pupil Pupils[PupilAmount];
        // 批量读取学生数据
        for (int i = 0; i < PupilAmount; i++) {
            fscanf(fp, "%19s %d %d %d %d %d %d", 
                   Pupils[i].Lastnames, 
                   &Pupils[i].DM210, &Pupils[i].DM211, &Pupils[i].DM212,
                   &Pupils[i].DM213, &Pupils[i].DM214, &Pupils[i].DM215);
            // 浮点数计算避免精度丢失,结果转整数
            arr[i] = (int)((Pupils[i].DM210*2.0 + Pupils[i].DM211*2.0 + Pupils[i].DM212 +
                      Pupils[i].DM213 + Pupils[i].DM214 + Pupils[i].DM215)/8.0);
        }

        // 所有数据读取完成后执行排序
        qsort(Pupils, PupilAmount, sizeof(struct Pupil), compare);

        // 格式化打印结果
        printf("Lastname  Overall Percentage Mark  DM210  DM211  DM212  DM213  DM214  DM215\n");
        for (int i = 0; i < PupilAmount; i++) {
            printf("%-10s %22d %8d %8d %8d %8d %8d %8d\n",
                   Pupils[i].Lastnames, arr[i],
                   Pupils[i].DM210, Pupils[i].DM211, Pupils[i].DM212,
                   Pupils[i].DM213, Pupils[i].DM214, Pupils[i].DM215);
        }

        fclose(fp);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:01:08