2014-10-11 81 views
0

該分配是從文本文件讀取單詞,然後將它們反向打印到另一個文本文件。我在將讀入的單詞放入數組中時遇到問題。我不應該分配更多的內存來保存每個字符串,所以我能想到的唯一解決方案是將每個單詞放在tempString中,測量它的長度,然後分配足夠的內存來保存它並移動到下一個單詞。我的困惑是爲什麼每次迭代都會改變數組中的每個單詞。我希望最後一行是五四四。將文件中的字符串分配給字符串數組遇到困難

我也認爲我的方法是馬虎,因爲具有比tempString的長度更長的字符串會導致一個問題,但我無法想出解決方案。

這是我的代碼。

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

/* 
* 
*/ 

char** readWords(int* nPtr); 

int main() { 
    int numWords = 0; 

    readWords(&numWords); 

    return 0; 
} 



char** readWords(int* nPtr){ 
    int i = 0; 
    int listIndex = 0; 
    char tempChar = 0; 
    char** stringArray = NULL; 
    char tempString[50] = {}; 

    FILE *inputfile=fopen("inputfile.txt","r"); 
    fscanf(inputfile,"%d\n",nPtr); //Makes numWords = integer on first line 

    stringArray = calloc(*nPtr, sizeof(char*)); 

    for(i=0;i<*nPtr;i++){ 
     fscanf(inputfile,"%s", tempString); 
     stringArray[*nPtr-1-i] = calloc(strlen(tempString)+1, sizeof(char)); 
     stringArray[*nPtr-1-i] = tempString; 
     printf("tempString: %s\n",tempString); 
     printf("stringArray index: %d\n",*nPtr-1-i); 
     printf("stringArray: %s%s%s%s%s\n",stringArray[0],stringArray[1],stringArray[2],stringArray[3],stringArray[4]); 
    } 


    fclose(inputfile); 

} 

這是我的輸出

tempString: one 
stringArray index: 4 
stringArray: (null)(null)(null)(null)one 
tempString: two 
stringArray index: 3 
stringArray: (null)(null)(null)twotwo 
tempString: three 
stringArray index: 2 
stringArray: (null)(null)threethreethree 
tempString: four 
stringArray index: 1 
stringArray: (null)fourfourfourfour 
tempString: five 
stringArray index: 0 
stringArray: fivefivefivefivefive 

RUN SUCCESSFUL (total time: 64ms) 

這是我的輸入文件

5 
one 
two 
three 
four 
five 

建議是非常讚賞

+0

您忘記將臨時字符串複製到您爲數組分配的空間中。 – michaelmeyer 2014-10-11 04:54:53

+0

這段代碼有許多錯誤。最可怕的是你每次看到'ptr = some-allocation-function(...);'後面跟着'ptr =別的東西;'你只是(a)複製一個地址;不是一塊內存,和(b)在兩條短行內泄漏內存(只比記錄多一個內存;一個沒有分配的空白'malloc')。快速修復是一個'strcpy'而不是一個任務,但是這個代碼真的需要更多的幫助。 – WhozCraig 2014-10-11 05:03:02

+0

謝謝,我用strcpy,它現在可以工作。我沒有完全想到字符串是c中的指針而不是數據類型。你介意在我的代碼中列出其他一些錯誤的東西嗎? (b)我不知道你的意思。不calloc初始化內存爲空?你沒有分配什麼意思。我對動態內存分配很陌生。 – Esoremada 2014-10-11 05:24:31

回答

1

有效的所有數組元素被分配tempString值,所以他們都指向同樣的地方持有人,因此最終他們都指向th將最後一個值存儲到tempString中。修復方法是將tempString的內容複製到相應數組元素的已分配佔位符中:

strcpy(stringArray[*nPtr-1-i], tempString); 
+0

清楚的解釋,謝謝 – Esoremada 2014-10-11 05:18:17

+0

@ user3620725:如果Ron的回答充分回答了您的問題,接受答案通常是一個好主意。更多關於接受答案可以在這裏找到(http://meta.stackexchange.com/a/5235/271768) – 2014-10-11 06:58:01

+0

@ user3620725 - 雖然'fscanf'沒有錯,你可能會發現'getline'是優越的對於行輸入,由於它返回讀取的字符數**和**當'** lineptr'設置爲'NULL'時能夠根據需要動態分配內存。看到'男人getline' - 絕對值得一看。 – 2014-10-11 08:56:41

相關問題