C语言学生成绩统计代码总分输出异常随机大数如何修复?
问题原因
你的代码存在3个核心错误,直接导致总分计算异常:
calcTtlMark函数中局部变量i未初始化,是随机垃圾值,你用studs[i]访问的是非法内存地址,求和结果自然是随机大数- 调用
calcTtlMark时你传入的是单个学生的地址&studs[i],但函数形参设计为数组类型,逻辑不匹配,不需要用下标访问,直接取传入的第一个元素的成绩求和即可 main函数中调用displays时传入的&studs[i]参数非法,外层定义的int i未初始化,指向随机内存,只是你运行时运气好刚好碰到了数组首地址才没出现展示异常,属于隐藏BUG
修复方案
1. 修改calcTtlMark函数逻辑
改成直接对传入的单个学生成绩求和:
int calcTtlMark(struct Pelajar* stud) { return stud->subMark.bm + stud->subMark.bi + stud->subMark.math + stud->subMark.sains; }
2. 修正main函数中displays的传参
直接传数组首地址即可:
displays(studs);
3. 修正calcTtlMark的调用传参
传入单个学生的指针即可:
sum = calcTtlMark(&studs[i]);
可选优化
去掉scanf中数组名前多余的&,符合C语言语法规范,比如scanf("%s", studs[i].studId)。
完整修复后代码
#include <stdlib.h> #include <stdio.h> #include <conio.h> struct Sabjek { int bm; int bi; int math; int sains; }; struct Pelajar { char studId[10]; char studName[20]; char clsRoom[20]; struct Sabjek subMark; int totalMark; }; void displays(struct Pelajar studs[]) { printf("\t\tSTUDENTS INFO"); for(size_t i=0;i<2;i++) { printf("\nStudent ID: %s", studs[i].studId); printf("\nStudent's name: %s", studs[i].studName); printf("\nClassroom: %s", studs[i].clsRoom); printf("\nSubject Marks:- "); printf("\nBahasa Melayu: %d", studs[i].subMark.bm); printf("\nBahasa Inggeris: %d", studs[i].subMark.bi); printf("\nMatematik: %d", studs[i].subMark.math); printf("\nSains: %d", studs[i].subMark.sains); printf("\n---------------------------------\n"); } } int calcTtlMark(struct Pelajar* stud) { return stud->subMark.bm + stud->subMark.bi + stud->subMark.math + stud->subMark.sains; } int main() { struct Pelajar studs[2]; int sum; for(size_t i=0;i<2;i++) { printf("\nStudent ID: "); scanf("%s", studs[i].studId); printf("\nStudent's name: "); scanf("%s", studs[i].studName); printf("\nClassroom: "); scanf(" %[^\n]s", studs[i].clsRoom); printf("\nSubject Marks:- "); printf("\nBahasa Melayu: "); scanf("%d", &studs[i].subMark.bm); printf("\nBahasa Inggeris: "); scanf("%d", &studs[i].subMark.bi); printf("\nMatematik: "); scanf("%d", &studs[i].subMark.math); printf("\nSains: "); scanf("%d", &studs[i].subMark.sains); } system("cls"); displays(studs); printf("\t\tSTUDENTS TOTAL MARKS"); for(size_t i=0;i<2;i++) { printf("\nTotal marks for student name: %s is ", studs[i].studName); sum=calcTtlMark(&studs[i]); printf("%d", sum); printf("\n---------------------------------\n"); } return 0; }
修复后运行即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Irfan
相关产品推荐
相关产品推荐

