[英]How to assign a value to a struct that is returned through a function in C
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()為“名稱”分配一個值,該值是另一個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:這是那些有興趣的struct defs。
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”的值時,我遇到了“ segmentation fault”。 有人知道為什么嗎?
studentID(ID)
返回您需要在其中存儲數據的結構的副本 ,您需要將其存儲到另一個結構中。 您可能想返回一個指向它的指針並使用以下語法:
strcpy(studentID(ID)->det.name, pD);
但是您還應該注意潛在的緩沖區溢出:例如, %s
scanf
格式的scanf
不知道pD
指向的數組的大小。 您應該這樣寫:
scanf("%29s", pD);
但是,告訴scanf
緩沖區大小非常麻煩,因為大小信息必須硬編碼在格式字符串中,如果以后更改數組pD
的實際大小,可能會變pD
同步。 scanf
很難正確使用。
C不允許您使用equal運算符直接分配字符串。 您可以使用strncpy(包括string.h)。 通過在終端中輸入“ man strncpy”或對其進行谷歌搜索來了解該功能。
您尚未出示struct student
聲明; 但看起來name
是一個字符數組。 然后,
scanf("%s", &pD);
不正確,應為scanf("%s", pD);
因為pD
已經是字符串字符的地址。
另外, studentID(ID).det.name = pD;
同樣也是不正確的,不能對字符串變量使用直接分配,而應使用strcpy
。
我想你想要這樣的東西。 使用指針。
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
的定義,但是請不要做愚蠢的事情,例如將固定數組的(指針指向第一個元素)分配給多個結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.