C语言结构体编程报错求助:E0029、E0020等错误排查
代码错误分析与修复方案
以下针对你遇到的Visual Studio错误,结合代码问题逐一说明并修复:
1. E0029(语法错误:缺少必要分隔符)
- 问题位置:
personA= { "Daniel",10 {100,98,90} };
结构体初始化时,成员间需用逗号分隔,marks数组的初始化也要包裹在花括号内,正确写法:personA = {"Daniel", 10, {100, 98, 90}}; - 额外语法问题:第一个
for循环末尾多了分号for (i = 0;i < N;++i); {,这会导致循环体为空,后续大括号内代码仅执行一次,且此时i的值已变为N(5),访问s[i]会触发数组越界,必须删除该分号。
2. E0020/C2065(未定义标识符)
- 问题位置:
scanf_s("%f", &array[i]);
代码中从未声明过array变量,该语句完全多余,直接删除即可。
3. C2109(下标要求数组或指针类型)
- 问题1:
SMCstudent->marks[0] = 99;SMCstudent是数组类型,访问第一个元素的marks需用下标+成员访问符:SMCstudent[0].marks[0] = 99; - 问题2:
scanf_s("%s", &s[i].marks);
你本意是读取学生姓名,却错误指向了marks(float数组),应改为s[i].firstName;且scanf_s读取字符串必须指定缓冲区大小,正确写法:scanf_s("%s", s[i].firstName, (unsigned)_countof(s[i].firstName)); - 问题3:
scanf_s("%f", s[i].marks[j]);scanf_s读取float需要传入变量地址,应改为&s[i].marks[j];同时原代码的成绩读取循环逻辑错误,需嵌套到学生信息读取循环中,才能为每个学生录入成绩。
完整修复后的代码(匹配3名学生的需求)
#include <stdio.h> #define N 3 // 按你的需求将学生数量改为3 struct student { char firstName[50]; int roll; float marks[3]; }s[N]; typedef struct { char firstName[50]; int roll; float marks[3]; }student_t; int main() { int i, j; double total = 0; double marks_avg ; student_t personA, personB, SMCstudent[N]; SMCstudent[0].marks[0] = 99; personA = {"Daniel", 10, {100, 98, 90}}; printf("Enter information of students:\n"); // 存储学生信息与成绩 for (i = 0; i < N; ++i) { s[i].roll = i + 1; printf("\nFor student number %d:\n", s[i].roll); printf("Enter first name: "); scanf_s("%s", s[i].firstName, (unsigned)_countof(s[i].firstName)); printf("Enter 3 marks: "); for (j = 0; j < 3; j++) { printf("\nEnter grade %d: ", j+1); scanf_s("%f", &s[i].marks[j]); } } // 计算所有成绩的平均分(若需单门课平均分,删除内层循环直接累加对应下标即可) for (i = 0; i < N; i++) { for (j = 0; j < 3; j++) { total += s[i].marks[j]; } } marks_avg = total / (N * 3); // 3门课,总共有N*3个成绩 printf("\nAverage grade for %d students is %.2f\n\n", N, marks_avg); printf("Displaying information:\n"); for (i = 0; i < N; i++) { printf("\nStudent %d: %s\n", s[i].roll, s[i].firstName); printf("Marks: %.1f, %.1f, %.1f\n", s[i].marks[0], s[i].marks[1], s[i].marks[2]); } return 0; }
额外说明
- 原代码中
struct student和student_ttypedef重复,实际开发建议保留一种即可; - 原代码仅累加了第三门课的成绩,修复后改为计算所有成绩的平均分,若需单门课平均分,可调整累加逻辑。
内容的提问来源于stack exchange,提问作者chefdue91
相关产品推荐
相关产品推荐

