extern int ID; // student ID number
struct personalDetails det; // pD
struct classRecords rec; // cR
struct student st1; // student 1
struct student st2; // student 2
struct student st3; // student 3
struct student st4; // student 4
struct student st5; // student 5
char pD[30]; // for storing values that will be assigned to personalDetails
double cR; // for storing values that will be assigned to classRecords
struct student studentID(int id) { // identifies student by ID
if (id == 1) {
struct student x = st1;
return x;
}
else if (id == 2) {
struct student x = st2;
return x;
}
else if (id == 3) {
struct student x = st3;
return x;
}
else if (id == 4) {
struct student x = st4;
return x;
}
else if (id == 5) {
struct student x = st5;
return x;
}
}
我需要函数updateName()来为'name'赋值,这是另一个struct personalDetails中的值。
void updateName() {
printf("Enter student's name\n");
scanf("%s", pD);
studentID(ID).det.name = pD;
我目前收到此错误:
operations.c: In function ‘updateName’:
operations.c:55:24: error: lvalue required as left operand of assignment
studentID(ID).det.name = pD;
请提前告诉我如何解决这个问题!
编辑1:这是针对那些感兴趣的人的结构def。
struct personalDetails {
char *name;
char *phoneNum;
char *address;
};
struct classRecords {
double assignment;
double midterm;
double finalMark;
double total;
};
struct student{
struct personalDetails det;
struct classRecords rec;
};
感谢您的答案,strcpy摆脱了编译错误,但现在当我输入'name'的值时,我得到了'分段错误'。谁知道为什么?
答案 0 :(得分:1)
studentID(ID)
会返回存储数据的结构的副本,您需要存储到另一个结构中。您可能希望返回指向它的指针并使用以下语法:
strcpy(studentID(ID)->det.name, pD);
但是您还应该注意潜在的缓冲区溢出:例如,scanf
格式的%s
不知道pD
指向的数组的大小。你应该写这个:
scanf("%29s", pD);
但是告诉scanf
缓冲区大小非常麻烦,因为大小信息必须在格式字符串中进行硬编码,如果稍后更改数组pD
的实际大小,可能会变得不同步。 scanf
使用起来非常棘手。
答案 1 :(得分:0)
C不允许您使用等于运算符直接分配字符串。您可以使用strncpy(包括string.h)。通过输入' man strncpy'来了解该功能。在终端或谷歌搜索它。
答案 2 :(得分:0)
您尚未展示您的struct student
声明;但看起来像name
是一个字符数组。然后,
scanf("%s", &pD);
不正确,应为scanf("%s", pD);
,因为pD
已经是字符串字符的地址。
此外,studentID(ID).det.name = pD;
也不正确,您无法对字符串变量使用直接分配,请改用strcpy
。
答案 3 :(得分:0)
我想你想要这样的东西。使用指针。
extern int ID; // student ID number
struct personalDetails det; // pD
struct classRecords rec; // cR
struct student st1; // student 1
struct student st2; // student 2
struct student st3; // student 3
struct student st4; // student 4
struct student st5; // student 5
char pD[30]; // for storing values that will be assigned to personalDetails
double cR; // for storing values that will be assigned to classRecords
struct student *studentID(int id) { // identifies student by ID
if (id == 1) {
return &st1;
}
else if (id == 2) {
return &st2;
}
else if (id == 3) {
return &st3;
}
else if (id == 4) {
return &st4;
}
else if (id == 5) {
return &st5;
}
}
void updateName() {
struce student *s;
printf("Enter student's name\n");
scanf("%29s", pD);
s = studentID(ID);
s->det.name = malloc(strlen(pD) + 1);
strcpy(s->det.name, pD);
}
我不确定这是否正确,因为我不知道struct student
的定义,但请不要做如此愚蠢的事情,如分配一个(指向第一个元素的指针)固定数组多个结构。