我有下面的代碼來填充字符串數組,但每次我改變的值,整個數組的變化(而不是一個單一的字符串數組)填充動態分配的字符串數組?
2
A
回答
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
這段代碼的問題是,你有分配一個緩衝區來接收來自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;
}
}
相關問題
- 1. 動態填充字符串數組
- 2. 動態分配的字符串數組
- 3. 動態分配字符串數組
- 4. 字符串數組填充字符
- 5. 填充動態數組與未知的字符串
- 6. 字符串自動填充靜態字符匹配字符串長度
- 7. 從字符串填充數組字節
- 8. 將字符串拆分爲完全動態分配的字符串數組
- 9. 指針算術填充動態分配的數組在C
- 10. 用字符串數組填充表
- 11. 從字符串數組填充java.awt.list
- 12. 填充有字符串數組
- 13. 用哨兵填充字符串數組
- 14. 用字符串數組填充UITableView
- 15. 用字符串數組填充列表
- 16. 填充字符串數組Android
- 17. 動態填充數組PHP
- 18. 填充JSON數組動態
- 19. 填充VBA動態數組
- 20. 填充動態數組
- 21. PHP動態填充數組
- 22. 分配字符串數組
- 23. 動態分配字符串數組的問題
- 24. 動態分配字符串數組,然後更改它的值?
- 25. 動態分配的字符串數組沒有被釋放
- 26. 動態分配的字符串數組c
- 27. 將字符串讀入動態分配的數組
- 28. 使用字符串填充字符串數組? (JAVA)
- 29. 動態分配字符串文字
- 30. JAVA-如何動態地將字符串值分配給字符串數組
感謝指出char **問題,我試着用strncopy,我得到以下錯誤: '0xC0000005:訪問衝突寫入位置0xcdcdcdcd' 看起來像指針是NULL仍然 – Bonk 2012-03-25 03:04:41
@YonkShi這可能是因爲你沒有'從數組中的每個字符串中分配內存。使用我的最後一段代碼,使fscanf讀取到txt,然後在下一行執行strncpy。這應該工作。 – Mig 2012-03-25 03:14:10