2012-03-25 99 views

回答

5

那是因爲你是相同的字符指針爲陣列的所有位置。

當你這樣做:

words[i] = txt; 

您分配一個指針。所以每個word[i]是相同的字符串(txt)。 如果你真的想讀單詞到緩衝區中(如txt),然後把它變成字符串數組,你需要將字符串緩衝區的內容複製到字符串數組中,像這樣:

strncpy(words[i], txt, MAX_WORD_LENGTH); 

你的代碼還有另外一個問題,那就是字符串數組的分配問題。 它應該是:

words = (char**)malloc(wordcount * sizeof(char*)); 

這是因爲一個字符串數組是一個指向字符指針(char**),並且陣列中的每個元素是一個字符串(char*)。現在你已經分配的字符指針的數組,但你有沒有分配給每個字符串,內存這是我們下一步:

for (i = 0; i < wordcount; i++) { 
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char)); 
} 

如果你想不使用緩衝區並直接讀取到字符串數組,你的代碼應該是這樣的:

words = (char**)malloc(wordcount * sizeof(char*)); 
input = fopen(filename, "r"); 
while(!feof(input)) { 
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char)); 
    fscanf(input, "%s", words[i]); 
} 
+0

感謝指出char **問題,我試着用strncopy,我得到以下錯誤: '0xC0000005:訪問衝突寫入位置0xcdcdcdcd' 看起來像指針是NULL仍然 – Bonk 2012-03-25 03:04:41

+0

@YonkShi這可能是因爲你沒有'從數組中的每個字符串中分配內存。使用我的最後一段代碼,使fscanf讀取到txt,然後在下一行執行strncpy。這應該工作。 – Mig 2012-03-25 03:14:10

0

這段代碼的問題是,你有分配一個緩衝區來接收來自fscanf的字符串數據。每次從文件讀取一個字符串時,它都會被放入txt緩衝區。單詞數組中的每個指針都指向txt。所以在操作結束時,你有很多指向同一個緩衝區的指針,它包含一個字符串。

1

您需要爲每個單詞分配空間和複製字符串到這個分配的空間:

input = fopen(filename, "r"); 
while(!feof(input)){ 
    if(fscanf(input,"%s", txt)){ 
     /* malloc for word here */ 
     words[i] = malloc(strlen(txt)+1); 
     strcpy(words[i], txt); //<---Problem line right here 
     ++i; 
    } 
} 
+0

是一個單詞還是所有單詞的malloc? malloc是我的代碼是分配空間的所有單詞要存儲在這個數組 – Bonk 2012-03-25 02:57:18

+0

是的,但它存儲指針。您還需要爲每個單詞(這是我添加的單詞)分配內存,並將它們分配給您分配給 – perreal 2012-03-25 02:58:11

+0

的指針!有效!你有沒有malloc爲每一個字符串在未來?怎麼樣'char * a =「一個字符串」;'爲什麼沒有malloc工作? – Bonk 2012-03-25 03:09:18