2011-11-24 6 views
0

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; 
    } 
} 
+6

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

+0

Comme pmg suggérer le problème est dans list_append() –

+0

Comment copier le 'char []' et pas le pointeur? – kh4r4

Répondre

1

Comme les commentaires ont noté, vous manipulez les chaînes de caractères mal. Les chaînes de style C ne sont pas des choses que vous pouvez égaler ==, ou assigner avec =. Ceci est un tutoriel C++, mais donne une bonne explication de C-cordes:

http://www.learncpp.com/cpp-tutorial/66-c-style-strings/

Consultez également la documentation strcmp(), strcpy() et strlen(). J'ai corrigé les bits notés dans les commentaires en utilisant ces fonctions - notez mes commentaires: