如何为通过C中的函数返回的结构赋值

时间:2015-12-03 01:36:15

标签: c struct

 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'的值时,我得到了'分段错误'。谁知道为什么?

4 个答案:

答案 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的定义,但请不要做如此愚蠢的事情,如分配一个(指向第一个元素的指针)固定数组多个结构。