因此,首先,這是一項家庭作業,所以請不要爲我編寫任何代碼,只需指出我的代碼錯誤。在字符串操作/指針中找不到錯誤
該代碼的基礎是它是一個'地址/平衡'的書。我有一個結構與我的變量,但由於某種原因,我的雙鏈表變得混亂起來,我不知道如何。隨着一些花哨的(不是真正的)調試,我發現我認爲fgets(string,200,file);行會以某種方式覆蓋我的head-> name指針,這似乎會拋出其餘的代碼。相關的代碼片段在這裏:
填充列表:
void populate_list(char* filename){
FILE *file = NULL;
char* name = NULL;
char* streetaddress = NULL;
char* city = NULL;
char* state = NULL;
char line[200];
int zip;
float balance;
file = fopen(filename,"r");
if(file==NULL){
printf("Invalid input file\n");
exit(1);
}
if(file == 0){
printf("Invalid file.\n");
exit(1);
}
while(!feof(file)){
fgets(line, 200, file);
name = strtok(line, ",");
streetaddress = strtok(NULL, ",");
city = strtok(NULL,",");
state = strtok(NULL,",");
zip = atoi(strtok(NULL,","));
balance = atof(strtok(NULL,","));
strip_spaces(name);
strip_spaces(streetaddress);
strip_spaces(city);
strip_spaces(state);
add_node(name, streetaddress, city, state, zip, balance);
}
fclose(file);
return;
}
然後add_node代碼:
void add_node(char* name, char* streetaddress, char* city, char* state, int zip, float, balance){
struct customer* addnode = NULL;
if(find_duplicate(name)){
print_filler(1);
printf("DUPLICATE RECORD: %s\n", name);
return;
} else {
addnode = (struct customer *) malloc(sizeof(struct customer));
addnode->name = name;
addnode->streetaddress = streetaddress;
addnode->city = city;
addnode->state = state;
addnode->zip = zip;
addnode->balance = balance;
if(head == NULL) {
head = addnode;
addnode->prev = NULL;
} else {
tail->next = addnode;
addnode->prev = tail;
}
tail = addnode;
addnode->next = NULL;
}
print_list();
return;
}
的錯誤似乎第一次add_node被稱爲後要發生的事情,發生在與fgets( )第二次出發。它出於某種原因覆蓋了頭部 - >整個fgets()行的名稱。
還有其他隨機惱人的bug我還沒有固定,但這個我認爲可能是其他人的來源。
的完整代碼在這裏,如果有幫助:http://pastebin.com/k0pqyvT0
我的猜測是它的東西做的頭戴式>名稱指針通過與fgets()被覆蓋,但我不能爲我的數字生活做什麼,這是什麼,任何幫助/建議,將不勝感激。
編輯:解決方案是實現strdup()並在傳遞給add_node()時複製字符串。感謝所有的答案。
第一句話的+1 – 2010-12-03 02:36:37
啓動時加載的文件列表在哪裏? – jussij 2010-12-03 02:48:42
該文件位於我的eclipse工作區中。我知道它正在被正確解決,問題在我的代碼中。 – Charles 2010-12-03 02:53:29