如何初始化结构体字符数组?遇“Expression must have a modifiable lvalue”报错
嘿,我来帮你搞定这个问题!你遇到的“Expression must have a modifiable lvalue”错误,核心原因是结构体里的name是字符数组类型——在C语言中,数组名是指向数组首元素的常量指针,不能直接用赋值运算符=给整个数组赋值,就像你不能写char arr[50]; arr = "test";一样,编译器会判定你在试图修改一个不可变的左值,所以报错。
解决方案:用
strcpy(或更安全的strncpy) 没错,你确实需要借助字符串拷贝函数来给结构体里的字符数组赋值,下面给你详细讲用法:
1. strcpy的基础用法
strcpy是C标准库<string.h>中的函数,作用是把源字符串的内容完整拷贝到目标字符数组里。使用前一定要先包含头文件:
#include <string.h>
比如你要给item[0].name赋值为"Gnar",可以这么写:
strcpy(item[0].name, champion1); // 也可以直接用字符串字面量:strcpy(item[0].name, "Gnar");
2. 更安全的选择:strncpy
如果担心源字符串长度超过目标数组的容量(比如你的name是50字节,源字符串太长会导致缓冲区溢出),推荐用strncpy,它能指定最大拷贝长度:
strncpy(item[0].name, champion1, sizeof(item[0].name) - 1); item[0].name[sizeof(item[0].name) - 1] = '\0'; // 手动添加字符串结束符,避免乱码
这里减1是为了留一个字节放字符串结束符\0——因为strncpy如果源字符串长度超过指定值,不会自动补\0,手动加上能避免输出时出现乱码。
3. 替代方案:结构体初始化时直接赋值
如果是在定义结构体变量的同时初始化,也可以不用拷贝函数,直接在初始化列表里给name赋值:
// 单个结构体变量初始化 ITEM sword = {"Long Sword", 10, 0, 5, 0, 1}; // 结构体数组初始化 ITEM item[10] = { {"Gnar's Item", 20, 5, 8, 0, 0}, {"Vi's Gauntlets", 30, 0, 10, 0, 1}, // 其他元素可继续按格式初始化 };
结合你的代码修改示例
把你的代码补充完整后,正确的写法大概是这样:
#include <stdio.h> #include <string.h> // 必须包含这个头文件 typedef struct { char name[50]; int attackDamage; int magicDamage; int defense; int power; int type; } ITEM; int main() { ITEM item[10]; char itemset[5][5] = { 0 }; char champion1[] = "Gnar"; char champion2[] = "Vi"; char champion3[] = "Fizz"; char champion4[] = "Draven"; char champion5[] = "Blitzcrank"; // 假设这里是完整的英雄名 // 给第一个item的name赋值 strcpy(item[0].name, champion1); // 给第二个item的name赋值,用strncpy更安全 strncpy(item[1].name, champion2, sizeof(item[1].name) - 1); item[1].name[sizeof(item[1].name) - 1] = '\0'; // 给item的其他字段赋值 item[0].attackDamage = 15; item[0].defense = 5; // ... 其他字段同理赋值 // 测试输出 printf("Item 0 name: %s\n", item[0].name); printf("Item 1 name: %s\n", item[1].name); return 0; }
内容的提问来源于stack exchange,提问作者canineheart
相关产品推荐
相关产品推荐

