2013-02-22 138 views
4

我遇到了相當基本的代碼問題。我需要從下面顯示的文件中讀取每行,使用strtok將它分成3部分,並將每個部分存儲到一個數組中。 「目標」和「助手」的數組工作正常,但由於某種原因,整個名稱數組中充滿了從文件中讀取的姓氏。使用fgets和strtok從文件中讀取和解析行

輸入文件:

Redden 2 0 
Berglund 5 2 
Jackman 2 0 
Stewart 4 0 
Oshie 3 5 
McDonald 2 4 
Pietrangelo 2 7 
Perron 2 6 
Tarasenko 5 5 

相關代碼:

int main(int argc, char* argv){ 
    FILE* inFile = fopen(argv[1],"r"); 
    char ** nameArray; 
    int * goalArray; 
    int * assistArray; 
    int size = countLinesInFile(inFile); 
    allocateMemory(&goalArray, &assistArray, &nameArray, size); 
    readLinesFromFile(inFile, goalArray, assistArray, nameArray, size); 
} 

void allocateMemory(int** goals, int** assists, char*** names, int size) 
{ 
    *goals = malloc(size*sizeof(int)); 
    *assists = malloc(size*sizeof(int)); 
    *names = malloc(size*sizeof(char *)); 
    int i; 
    for(i=0; i<size; i++) 
    { 
    *(*names + i) = calloc(MAX_NAME,sizeof(char)); 
    } 
} 

void readLinesFromFile(FILE* fPtr, int* goals, int* assists, char** names, int numLines) 
{ 
    int i; 
    char * buffer = malloc(MAX_LINE*sizeof(char)); 
    for(i = 0; i<numLines; i++) 
    { 
    if(fgets(buffer, MAX_LINE, fPtr)!= NULL) 
    { 
     names[i] = strtok(buffer, " \n"); 
     goals[i] = atoi(strtok(NULL, " \n")); 
     assists[i] = atoi(strtok(NULL, " \n")); 
    } 
    } 
} 

出於某種原因,nameArray [0-9]中都含有 「塔拉先科」,和任何幫助,將不勝感激。

回答

1

strtok返回指向包含下一個標記的以null結尾的字符串的指針。要真正複製此令牌,你應該使用strcpy

strcpy(names[i], strtok(buffer,  " \n")); 
strcpy(goals[i], atoi(strtok(NULL, " \n"))); 
strcpy(assists[i], atoi(strtok(NULL, " \n"))); 

還要注意,在你的代碼中的內存泄漏:

void readLinesFromFile(/*...*/) 
{ 
    char * buffer = malloc(MAX_LINE*sizeof(char)); 
    // ... 
    fgets(buffer, MAX_LINE, fPtr); 
    // ... 
} 

您動態調用malloc分配buffer,但你不釋放這個內存。不要忘記在指向malloc分配的內存的指針上調用free()。但在這種情況下,具有自動存儲時間的陣列將是更好的選擇:

void readLinesFromFile(/*...*/) 
{ 
    char buffer[MAX_LINE]; 
    // ... 
    fgets(&buffer, MAX_LINE, fPtr); 
    // ... 
} 
1

您沒有複製出名稱,只是將由strtok返回的指針放入您的數據結構中。您剛剛結束了一個數據結構,其中包含指向buffer指向的同一內存的完全相同的指針。由於buffer的內容在循環中的每次傳遞都會被修改,所以最終會得到一堆指向最後一次通過的指針。

+0

明白了,謝謝! – user2100887 2013-02-22 21:10:52