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
相关产品推荐
相关产品推荐

