2015-12-03 59 views
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) { 
      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中的值。如何爲通過函數返回的結構賦值C

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:這是有興趣的結構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的擺脫了編譯錯誤的,但現在當我的「名字」輸入值,我收到了「分段錯誤」。有人知道爲什麼

+0

'typedef'是你的朋友;) –

回答

0

C不允許您使用等號運算符直接分配字符串。你可以使用strncpy(包括string.h)。通過在終端中鍵入'man strncpy'或使用Google搜索功能來閱讀該功能。

+0

即使在閱讀'strncpy'手冊後,OP也不應該使用它,這太容易出錯了。 – chqrlie

0

您還沒有顯示您的struct student聲明;但看起來像name是一個字符數組。然後,

scanf("%s", &pD);不正確,應該是scanf("%s", pD);,因爲pD已經是字符串字符的地址。

此外,studentID(ID).det.name = pD;也不正確,您不能使用直接分配字符串變量,而是使用strcpy

+0

嚴格地說,'pD'不是一個指針,而是一個數組。它將被轉換爲一個用作函數參數的指針。(更一般地,對於除'sizeof'和'&以外的操作符的操作數來獲取地址) – MikeCAT

+0

strcpy在編譯時擺脫了錯誤,但現在當我運行我的程序時,如果輸入值爲'名稱'。你知道這是爲什麼嗎? – rsorce

+0

SIGSEGV通常意味着您正在取消引用非初始化指針,或者您正在訪問數組越界。請檢查'student'結構中的'name'數據成員。 – artm

1

studentID(ID)返回一個複製你存儲的數據結構,你需要存儲到另一個結構。你可能想返回一個指向它,並使用此語法:

strcpy(studentID(ID)->det.name, pD); 

但你也應該注意潛在的緩衝區溢出,例如:scanf%s格式不知道數組的大小指出,由pD。而應該這樣寫:

scanf("%29s", pD); 

但告訴scanf有關緩衝區的大小是很麻煩的尺寸信息必須在格式字符串被硬編碼,並有可能不同步的,如果你以後更改數組的實際大小pDscanf正確使用非常棘手。

+0

所以他的'scanf'沒有錯? – artm

+0

@artm:'scanf'幾乎總是錯的;-)我更新了我的答案以反映這一點。 – chqrlie

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的定義,但請不要做出如此愚蠢的事情分配(指針的第一個元素)固定陣列到多個結構。

+0

我的歉意,我剛剛開始使用C.但每當我使用 - >我得到一個不同的錯誤 錯誤:無效類型參數的' - >'(有'結構的學生') strcpy(studentID(ID) - > det .name,pD); – rsorce

+0

@rsorce將'*'添加到'studentID()'的thr返回類型,並使其成爲像我一樣的指針。 – MikeCAT

+0

我更新了我的代碼。在那裏複製字符串之前,您將不得不分配一些緩衝區。 – MikeCAT