2012-01-10 41 views
0

我有,而在C.創建一個簡單的程序大的問題Ç - 字符串數組的創建,幫助請求

我有以下功能:

void createStrings (char *dictionary[], int *n) { 
int i; 
char word[20]; 

printf ("Insert how many words to use: "); 
scanf ("%d", &(*n)); 

// Initialization 
for (i = 0; i < *n; i++) { 
    dictionary[i] = '\0'; 
} 

// Populating the array with words 
for (i = 0; i < *n; i++) { 
    printf ("Insert the word in position %d: ", i); 
    scanf("%s", word); 
    dictionary[i] = word; 
} 
} 

在主我讀剛纔使用的數組詞彙

printf ("Following words have been inserted:\n"); 
for (i = 0; i < n; i++) { 
    printf ("dictionary[%d] = %s\n", i, dictionary[i]); 
} 

我很確定這最後一個循環已經實施得很好。

當我運行該程序,並嘗試插入,例如,三個不同的詞,如「一」「二」和「零」我得到以下輸出:

插入多少字的使用方法: 3

插入字號碼0:單

插入字編號1:兩個

插入字編號2:零

下列詞語已經被插入:

辭典[0] =零

辭典[1] =零

字典[2] =零

這就像只有最後一個字我插入得到保存,循環一路回去覆蓋數組的所有其他元素。

任何幫助將不勝感激。

回答

1

char word[20];是一個存儲位置:您將每個連續的dictionary[i]指向同一位置,但用新值覆蓋它。 所以,你只需要獲得一個指向內存塊的指針數組(你不應該在createStrings返回之後訪問,因爲它是本地函數)。

變化

dictionary[i] = word; 

dictionary[i] = strdup(word); 

爲儘可能小的變化。

我可以想到更多的改進,但它們可能屬於CodeReview,這應該足以使它工作。

+0

非常感謝,這解決了我的問題!也感謝其他人! – wiredmark 2012-01-10 12:10:19

+0

如果你只是添加'strdup',你會引入內存泄漏。 – 2012-01-10 12:18:38

+0

沒錯,但是這個代碼有很多可能的問題;因此我建議將它帶到[CodeReview](http://codereview.stackexchange.com/),而不是在這裏解決它們。 – Useless 2012-01-10 12:20:31

2

請勿使用=分配字符串。先爲它分配內存,然後複製。

0

你在你的代碼中的許多問題:

  • 你問他們要多少字進入用戶,然後你把這個很多的話到未知大小的數組。用戶可能輸入了大於數組的單詞數量。
  • 您允許用戶輸入任意數量的字符每個字,但您的字符串只能接受20.
  • 您將輸入的單詞存儲在函數內的局部變量中,此函數外的代碼嘗試訪問函數已經返回並且此變量的堆棧空間不再分配。

任何這些問題都可能導致您的代碼崩潰或允許用戶覆蓋他們不應該訪問的內存區域。你需要解決這些問題。

正如其他答覆者所說的,您需要使用strdup或其他東西來獨立地將每個字符串存儲在堆上。