我在使用char
类型时遇到问题。当我通过构造函数初始化我的结构中的ID
和Name
时,为什么我会收到此错误消息? "expression must be a modifiable lvalue"
。
struct Staff
{
char ID[8];
char Name[30];
Staff()
{
ID = "";
Name = "";
}
};
答案 0 :(得分:6)
由于这个问题被标记为C ++,并且代码仅使用了C ++的特性(例如构造函数),所以我假设您在标题中错误地将C与C ++混淆。
当你真的指字符串时,不要使用char
数组。请改用std::string
:
struct Staff {
std::string ID;
std::string Name;
};
通过这种方式,默认构造函数将按预期运行,您甚至不需要指定它。您需要的唯一附加行是包含必要标题的行:
#include <string>
位于文件的最顶部。
答案 1 :(得分:4)
char
只是另一种数字类型,如int
,但更小(通常是一个字节)。一系列字符并不特别 - 它基本上是一大堆内存。字符串文字在内部也是字符数组,但C ++没有内置支持复制operator=
的数组 - 你必须自己复制字节,例如通过(不推荐的){{1} C函数(包括strcpy
)。
在C ++中,处理字符串的常用方法是使用cstring
(include std::string
),这是一个为你包装字符串字节的类,并实现字符串复制,比较等。以干净,直观的方式。
你在string
结构的末尾也缺少一个分号,这会导致一些有趣的编译错误: - )
答案 2 :(得分:2)
您无法更改ID
或Name
的值,因为它是数组,而不是指针。
将其声明为char指针(在这种情况下,最好将其声明为const char*
):
const char *ID;
const char *Name;
或使用memset
:
memset(ID, '\0', sizeof(ID));
memset(Name, '\0', sizeof(Name));
这将&#34;初始化&#34;你的char
数组。
您可以使用strncpy
strncpy(Name, "John Doe", sizeof(Name)-1);
-1表示空终止字符。
答案 3 :(得分:1)
您需要做的是
struct Staff
{
char ID[8];
char Name[30];
Staff() :
ID{0}, // Null terminate the array same as, ID[0] = 0;
Name{0} // Null terminate the array same as, Name[0] = 0;
{
}
};