2015-12-19 102 views
0

我想讀取用戶輸入合併字符串和數字,像這樣:分配結構的數組,數組內

50:string one 
25:string two blablabla 
... 

我不知道投入將有多少行有,我也不要不知道弦的最大長度。

因此,我創建

typdedef struct line 
{ 
    int a 
    char *string 
} line; 

那麼這sturct

line *Array = NULL; 

現在我有一個循環,讀取一行並將其解析到temporaryString和temporaryA的數組。我如何重新分配數組以將它們複製到數組中?

+2

通過使用['realloc'](http://en.cppreference.com/w/c/memory/realloc)函數? –

+1

可能的重複[如何使此函數採取任意字符串?](http://stackoverflow.com/questions/34353204/how-do-i-make-this-function-take-arbitrary-strings) –

回答

0

你可能會這樣(僞代碼)。

idx = 0; 

while (input = read()) { 
    temporaryString, temporaryA = parse(input); 
    Array = realloc(Array, (idx + 1)*sizeof(line)); 
    Array[idx].a = temporaryA; 
    Array[idx].string = malloc(strlen(temporaryString) + 1); 
    strcpy(Array[idx].string, temporaryString); 
    idx++; 
} 
1

有兩種有效的選擇,你想要做什麼:

1)使用realloc()功能;它就像malloc和calloc一樣,但你可以重新分配你的記憶,因爲名字可以提供建議;

2)使用鏈表;

第二個比第一個更復雜,但也是非常有效的。在你的情況,一個簡單的鏈表可能有以下形式:

typdedef struct line 
{ 
    int a; 
    char *string; 
    line *next; 
    //line *prev; 

} line; 

每次你添加一個節點,你必須頁頭和你的新的數據結構線,接着設置指針爲NULL或本身,這是相同的,並將上一個下一個指針設置爲您創建的新數據。這是手動執行realloc的簡單方法。只有當你需要從最後一個項目到第一個項目時才需要prev指針;如果你不需要這個功能,只需保存根指針(第一個),並只使用下一個指針。