Est-ce que j'utilise incorrectement fgets()
?C: utilisation de fgets pour construire une liste chaînée de char *
J'essaye de construire une liste liée de chaînes (char *
) en ajoutant chaque nouvelle ligne à la fin de la LL. Je lis ces lignes à partir d'un fichier, mais pour une raison quelconque, chaque ligne est écrasée par la ligne en cours de traitement, uniquement lorsque vous utilisez fgets()
dans la boucle while
, mais la fonction d'ajout semble recevoir chaque ligne correctement.
Si j'ajoute des lignes individuellement dans main()
, il n'y a aucun problème.
Voici un fichier d'entrée exemple:
input.txt:
This life, which had been the
tomb of his virtue and of his
honour, is but a walking
shadow; a poor player, that
struts and frets his hour upon
the stage, and then is heard
no more: it is a tale told by an
idiot, full of sound and fury,
signifying nothing.
--William Shakespeare
Le code:
#include <stdio.h> //printf, fopen
#include <stdlib.h> //exit, EXIT_FAILURE
#include <string.h> //strlen
struct node {
char *line;
struct node *next;
};
void print(struct node *node);
void add(struct node **head, char *newLine) {
//printf("%s", newLine);
struct node *new_node = (struct node *)malloc(sizeof(struct node));
struct node *curr = *head;
new_node->line = newLine;
new_node->next = NULL;
if (*head == NULL) {
*head = new_node;
} else {
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = new_node;
}
print(*head);
}
void print(struct node *node) {
printf("\n");
while (node != NULL) {
printf("%s\n", node->line);
node = node->next;
}
}
int main(int argc, char *argv[16]) {
char newLine[81];
struct node *head = NULL;
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("ERROR: file open failed");
exit(EXIT_FAILURE);
}
while (fgets(newLine, 81, fp)) {
add(&head, newLine);
}
add(&head, "why");
add(&head, "does");
add(&head, "this");
add(&head, "work??");
fclose(fp);
print(head);
return 0;
}
Quelqu'un pourrait-il expliquer s'il vous plaît me ce qui se passe? Je me suis cogné la tête contre un mur pendant trop longtemps. Il y a déjà quelques instructions d'impression commentées que j'essayais d'utiliser, sans succès pour le débogage.
chercher du papier. Tracez les appels à 'add' et dessinez une représentation de votre liste chaînée. Portez une attention particulière à ce que 'node-> line' pointe vers. –
Il y a plusieurs kilodupes de ce comportement; –