Je suis aux prises avec un problème C et je ne peux pas comprendre ce que je fais mal. J'utilise une liste chaînée pour stocker des mots. Quand j'exécutez la commande suivante:Liste liée d'un fichier de mots
list *myList = list_new();
list_append(myList,"Word_01");
list_append(myList,"Word_02");
list_append(myList,"Word_03");
list_append(myList,"Word_04");
list_print(myList);
Tout est OK et je reçois cette sortie:
Word_01 -> Word_02 -> Word_03 -> Word_04 -> NULL
OK, maintenant je prends les mots d'une liste stockée dans un fichier:
Word_01
Word_02
Word_03
Word_04
Et exécutez ce code:
const char *filename;
filename = "list";
list *myList2 = list_new();
FILE* file = NULL;
size_t size;
char line[256];
file = fopen(filename, "r");
if (file != NULL)
{
printf("File opened.\n");
while (fgets(line, 256, file) != NULL) {
list_append(myList2, line);
}
fclose(file);
}
else {
printf("Could not open file.\n");
exit(EXIT_FAILURE);
}
list_print(myList2);
Ensuite, je reçois la sortie suivante:
Word_04 -> Word_04 -> Word_04 -> Word_04 -> NULL
Quelqu'un peut-il m'expliquer pourquoi cela se produit-il?
Edit: est ici list_append()
void list_append(list *l, char *w) {
word *new_word = malloc(sizeof(word));
if (l == NULL || new_word == NULL) {
exit(EXIT_FAILURE);
}
new_word->_word = w;
new_word->next = NULL;
if (l->first->_word == "") {
l->first = new_word;
}
else {
word *temp = malloc(sizeof(word));
temp = l->first;
while(temp->next != NULL) {
temp=temp->next;
}
temp->next = new_word;
}
}
Vous devez ** copier ** la chaîne dans 'list_append()'. Ce que vous faites maintenant, c'est enregistrer la valeur du pointeur (le pointeur sur 'line'). Chaque fois que le contenu de 'line' change tous ces pointeurs changent de la même manière. N'oublions pas non plus que 'fgets()' conserve le '' \ n'' – pmg
Comme pmg suggérer le problème est dans list_append() –
Comment copier le 'char []' et pas le pointeur? – kh4r4