我寫了這個函數(下面)。它應該逐行讀入文件。編輯該行並將某些單詞/字符放入各種功能中。然後將這些函數放入「入門」結構的數組(malloc)中。將增加到malloc數組的值變成malloc數組中的所有值
問題是,當我然後退出循環並嘗試打印出數組時,最後一個結構體名稱變量放入數組中是打印出來的唯一名稱變量。例如,如果我嘗試打印數組的前10個結構體名稱變量,則會打印出最後一個結構體名稱變量10次。整數(數字變量)工作正常但是。
我使用fgets()來讀取文件的行,並在文件末尾從循環中斷開。可能fgets()可能是問題,但似乎不太可能...
我不知道什麼問題,但正如我所說的數字變量打印罰款,但名稱打印出最後一個只。
但是從文件中獲取信息卻沒有。如果把我的循環打印語句放在while循環中,它仍然不起作用。
有一點需要注意的是,使用strtok,strcpy和strcat將行放入單獨的變量工作正常。我不認爲這是它造成的。
struct entrant {
int number;
char *name;
};
void read_in_entrants(char fileName[]) {
FILE *fr;
fr = fopen(fileName, "rt");
//Init.
struct entrant * entrant_array = (struct entrant*) malloc(sizeof (struct entrant));
int j, temp, k = 0;
int *number;
char line[80];
char name[80];
char surname[80];
while(1) {
//Read line in file.
fgets(line, 80, fr);
//If at end of file break from loop.
if (feof(fr)) break;
//Edit line to be stored in variables.
number = strtok(line, " ");
strcpy(name, strtok(NULL, " "));
strcpy(surname, strtok(NULL, " "));
strcat(name, " ");
strcat(name, surname);
//Add variables to struct array.
entrant_array[k].number = atoi(number);
entrant_array[k].name = name;
printf(" %d %s\n", entrant_array[k].number, entrant_array[k].name);
//Handle malloc array memory.
temp = realloc(entrant_array, (k + 2) * sizeof (struct entrant));
if (temp != NULL) {
entrant_array = temp;
} else {
free(entrant_array);
printf("Error in memory allocation!");
return 1;
}
//Increase k.
k++;
}
//Print struct values in array.
for (j = 0; j < 10; j++) {
printf(" %d %s", entrant_array[j].number, entrant_array[j].name);
}
//Shut down.
free(entrant_array);
fclose(fr);
}
無論如何,我一直在努力這個字面上幾個小時,現在我只是無法修復它。我對C的知識是非常有限的,我很遺憾我需要做些什麼來解決這個問題。
感謝您的幫助,這是非常讚賞:)
嘗試通過逐漸簡化代碼來減少問題。 – krlmlr
使用調試器(例如gdb)和內存泄漏檢測器(valgrind)編譯所有的警告和調試信息(例如'gcc -Wall -g'),改進代碼直至不給出警告。 –
對不起,我認爲整個功能會更有幫助:) – DanMc