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

C语言报错assignment to expression with array type原因及解决方法

报错根因

你遇到的[Error] assignment to expression with array type报错,直接触发原因是等级判断分支里的字符串赋值写法不符合C语言语法规则:
结构体中grade字段是char类型数组,C语言规定数组名属于不可修改的左值,不能直接用=运算符给整个数组赋值字符串常量,你写的st[i].grade = "A";这类语句就是非法操作,编译器直接抛出错误。

核心报错修复方法

你已经引入了<string.h>头文件,直接用strcpy()函数做字符串拷贝即可完成grade字段的赋值,替换原有if-else块的代码如下:

if(st[i].per>=80){
    strcpy(st[i].grade, "A");    
}
else if(st[i].per>=60){
    strcpy(st[i].grade, "B");
}
else if(st[i].per>=40){
    strcpy(st[i].grade, "C");
}
else{ // 前面分支都不满足必然是<40,冗余判断可以删掉
    strcpy(st[i].grade, "F");
}
其他影响项目运行的问题修复(提交前必改,不然功能异常)

改完上面的代码虽然能解决编译报错,但代码里还有不少逻辑错误会导致运行结果不对,一并修正:

  • 修正分数录入错误:录入计算机科学(pps)分数时,你误把值存到了engmech字段覆盖了工程力学成绩,把对应行的scanf("%d", &st[i].engmech);改成scanf("%d", &st[i].pps);
  • 修正百分比计算逻辑:原有代码运算优先级错误,除法只计算了pps单科分数,其余科目分数直接累加没有做平均,正确写法(5门课每门满分100的场景):
    st[i].per = (st[i].engmech + st[i].maths + st[i].epc + st[i].chem + st[i].pps) / 5.0;
    
  • 修正Division录入错误:原有代码写的是printf("%s", st[i].Div);,根本没有读入用户输入,改成scanf("%s", st[i].Div);,同时补上父亲姓名的录入逻辑,否则打印时会出乱码:
    printf("\nEnter Student's Father's Name:");
    scanf("%s", st[i].FatherName);
    
  • 修正查询学生函数find_Rstudent()的逻辑错误:
    • 循环起始下标从j=0开始(第一个学生存在数组0号位置),循环内所有st[i]改成st[j](j才是当前遍历到的学生下标,i是全局的学生总数变量)
    • 打印数学成绩的行,把st[i].engmech改成st[j].maths
    • 内层打印课程ID的循环,不要和外层循环重名用j,改成k,打印值用st[j].cid[k],不要直接传数组名
    • 把break放到if匹配成功的代码块里,不要放在循环最外层,不然遍历第一个学生就直接跳出
  • 修正更新学生函数update_student()的逻辑错误:循环匹配到的学生下标是j,所有修改操作的st[i]全改成st[j];读入grade的scanf去掉&,数组名本身就是地址,写成scanf("%s", st[j].grade);
  • 修正主循环死循环+数据丢失问题:把while(i=1)改成while(1),前者每次循环都会把全局学生计数i重置为1,之前录入的学生数据会被覆盖丢失
  • 把void main()改成标准写法int main(),函数末尾加return 0;,兼容所有C语言编译器的编译规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:06:10