Итак, во-первых, это домашнее задание, поэтому, пожалуйста, не пишите для меня никакого кода, просто укажите, где мой код неправильный.
Основой кода является то, что это адрес/ баланс 'книга.У меня есть структура с моими переменными, но по какой-то причине мой двусвязный список запутался, и я не могу понять, как.С немного причудливой (не совсем) отладкой я понял, что думаю 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 () отключается во второй раз.По какой-то причине он перезаписывает head-> name всей строкой fgets ().
Есть и другие случайные раздражающие ошибки, которые я еще не зафиксировал, но эта, я думаю, может быть источником других.
Полный код здесь, если он помогает: http://pastebin.com/k0pqyvT0
Я думаю, что это связано с тем, что указатель head-> name перезаписывается fgets (), но я не могуесли бы я понял, что именно делает это, любая помощь / совет будут оценены.
Редактировать: Решением было реализовать strdup () и продублировать строки, когда они передаются в add_node ().Спасибо за все ответы.