2017-02-11 95 views
2

我試圖使用動態內存將信息存儲在數據結構數組中。我已經設法使用我編寫的代碼存儲一組信息,但是,由於我的代碼只輸出最後一個用戶輸入,因此我無法確定如何存儲下一組輸入。將多個輸入存儲在C中的結構數組中

#include <stdlib.h> 
#include <stdio.h> 
#include <strings.h> 

struct student { 
    int recordCount; 
    char *firstName; 
}; 


int i; 
char buffer[1000]; 


int main(){ 

    struct student *sPtr= (struct student*) malloc(sizeof(struct student)); 
    sPtr->recordCount = 1; 

    while (1){ 

    sPtr=realloc(sPtr, sizeof(struct student)* sPtr->recordCount); 
    sPtr->recordCount++; 

    printf("First Name:\n"); 
    fgets(buffer, 51, stdin); 
    if (strncmp(".\n", buffer, 51) == 0) break; 

    else{ 
    sPtr->firstName=(char*)malloc(sizeof(char)*(strlen(buffer))); 
    strncpy(sPtr->firstName, buffer, strlen(buffer)); 
    } 

} 

現在,如果我的printf(「%S」,sPtr->的firstName)我只輸出用戶,其意義的,我最後輸入。我的問題是如何將輸入存儲到結構數組中。我正在考慮將輸入變成像sPtr [counter] - > firstName這樣的輸入,但我似乎無法讓代碼正常工作。任何幫助,提示將不勝感激。

謝謝!

回答

0

在我看來,sPtr是作爲學生結構數組的頭部啓動的,但是當你輸入更多的學生信息時,你不停地寫入相同的頭結構,而不必將指針移動到下一個結構。

我的建議是,使用單獨的指針newStuPtr,每次重新分配更多空間並增加記錄數時,請將新學生指針向前移動。

但是爲了使編碼更容易,考慮使用鏈表或增量數組。

此外,您的代碼中可能有兩個錯誤。

  1. mallocrealloc沒有free會導致內存泄漏。
  2. 對於新分配的第一個名字符串空間,您應該爲strncpy添加額外的NULL結尾。

    sPtr->firstName=(char*)malloc(sizeof(char)*(strlen(buffer))); strncpy(sPtr->firstName, buffer, strlen(buffer));

+0

嘿謝謝你,我會試試看。所以我應該strcpy sptr-> firstName到新指針newStuPtr [x] - > firstName?如果我使用新的指針,printf將如何看起來像?例如'printf(「%s,%s」,newStuPtr [1] - > firstName,newStuPtr [2] - > firstName);'[x]是存儲每個數據的結構數組?這只是一個部分程序,所以我沒有免費提供,還有一些代碼組件。 – George

+0

'newStuPtr'與'sPtr'類似,您可以通過從頭部'sPtr [i]'索引來訪問學生數組的第i個結構,或者使用'newStuPtr-> firstName'並將其轉發給(i + 1)th struct by'newStuPtr + = 1'。請注意,有一個更大的問題,你想在哪裏存儲學生的姓名。如果'student'結構是針對個別學生的,那麼就不需要在每個學生中存儲(不同的)'recordCount'。您可以使用C編程手冊來獲得設計和數據結構方面的幫助,然後您會發現代碼中的問題更少。 –

0

您沒有使用正確的數據結構,爲您的需求。鏈表是你的情況下,完美契合:

struct student { 
    char *firstName; 
    student * next; 
}; 

此外,調用realloc反覆是不是一個好的做法。大多數SO用戶不鼓勵進一步使用strncpy而不是strcpy。你甚至不會複製\0字符來標記字符串結束。嘗試使用上面的數據結構,看看事情是如何落實的。

+1

我看不到OP如何通過在結構數組上使用鏈表來獲益。 – RoadRunner

+0

@RoadRunner,OP提到他想要使用動態內存分配。 – VHS

+1

動態分配結構數組有什麼不對嗎?他甚至說他想「使用動態內存將信息存儲在數據結構數組中」。鏈表不作爲數組。 – RoadRunner