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

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_t typedef重复,实际开发建议保留一种即可;
  • 原代码仅累加了第三门课的成绩,修复后改为计算所有成绩的平均分,若需单门课平均分,可调整累加逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:50:26