将输入存入结构体后排序打印出现编译错误,请求解决
编译错误排查与修复方案
错误1:Pupils[i].DM213[i] 下标使用错误
- 原因:结构体
Pupil中DM213是单个int变量,并非数组或指针,不能通过下标[i]访问。 - 修复:将
Pupils[i].DM213[i]修改为Pupils[i].DM213。
错误2:compare 标识符未声明
- 原因:
qsort需要传入自定义比较函数,但代码中未定义/声明该函数,同时缺少qsort依赖的头文件<stdlib.h>。 - 修复:
- 在代码开头添加头文件引用:
#include <stdlib.h>和#include <string.h>(字符串比较需用到strcmp); - 在
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); }- 将结构体
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
相关产品推荐
相关产品推荐

