簡體   English   中英

如何為通過C中的函數返回的結構分配值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM