问题很简单,但我很困惑,为什么结构的行为是这样的,因为它的所有成员都是默认的public
,看看下面的代码
struct Student
{
char name[20];
}
int main()
{
Student s;
s.name="ahmed";
}
此代码给出一个错误,该名称应该是可修改的左值。
但是,如果我通过char
在循环char
中指定值,那么它就可以正常工作
s.name[0]='a';//works fine
答案 0 :(得分:2)
C中的数组是不可赋值和非可复制初始化的,在C ++中,这种行为是继承的。在右侧,数组衰减为指针,但在您的情况下,您的复制初始化是不允许的。
如果您尝试这样做:
{
char name[20];
name="ahmed";
}
你实际上正在复制初始化数组 - 而且这是不允许的。
唯一的例外是使用字符串文字
初始化它们 char c[] = "abc";
在您的情况下,您应该使用名为 strcpy 的功能来实现这一目标:
{
char name[20];
strcpy(&name[0],"ahmed"); // Obviously make sure that there's enough space
}
答案 1 :(得分:2)
值得注意的是,您还可以使用字符串来完成此任务:
#include<iostream>
#include<string>
using namespace std;
struct Student{
string name;
};
int main()
{
Student s;
s.name = "ahmed";
}
答案 2 :(得分:2)
在您的情况下,结构不是问题。 C中的数组不可分配。
而不是s.name = "ahmed"
,请使用strcpy(s.name,"ahmed")
答案 3 :(得分:1)
name
是一个数组,您无法分配给数组名称。相反,您应该使用std::strcpy
中的cstring
来复制C风格字符串的内容。
std::strcpy(s.name, "ahmed");
请注意,问题与name
是struct
的一部分无关。对于本机char
数组,您会遇到同样的问题。
答案 4 :(得分:0)
您必须使用:
struct Student
{
char *name;
};
int main()
{
Student s;
s.name = "ahmed";
return 0;
}