2010-09-17 19 views
1

J'essaie de faire un programme qui lit un fichier ligne par ligne et ensuite mettre la ligne lue dans une liste liée, mon problème est d'ajouter la chaîne à la liste. Regardez le code, dans l'autre test, vous pouvez voir mon problème.cstring problème pour un débutant

#include<stdlib.h> 
#include<stdio.h> 

struct list_el { 
    char *ord; 
     struct list_el * next; 
}; 

typedef struct list_el item; 

int main(int argc, char *argv[]) { 
    int c; 
    item *curr, *head; 
    head = NULL; 
    FILE *fileHandle = fopen("tresmaa.txt", "r"); 

    while((c = fgetc(fileHandle)) != '\n' || c != EOF) 
     if(c == EOF) { 
      printf("\n"); 
      break; 
     } else { 
      curr = (item*)malloc(sizeof(item)); 
      curr->ord = "I cant point curr -< ord = c, how can i point the readed sentences to the value Ord?"; 
      curr->next = head; 
      head = curr; 
      putchar(c); 
     } 
    curr = head; 

    while(curr) { 
     printf("%s\n", curr->ord); 
     curr = curr->next ; 
    } 
} 
+2

En dehors de votre problème, ce code fuit la mémoire! Vous devez "libérer" toute la mémoire qui a été allouée en utilisant 'malloc'. –

+0

Merci. J'ajouterai libre (curr) à mon code: D – user265767

Répondre

1
curr->ord = "some string" is wrong 

vous devez allouer un tampon et placer la chaîne en elle

par exemple

curr->ord = malloc(strlen(yourstring) + 1); 
strcpy(curr->ord, yourstring); 

parce

curr = (item*)malloc(sizeof(item)); 

alloue seulement la struct y compris le pointeur 'ord', mais pas ce qu'il pointe vers.

une autre chose qui ressemble un peu suspect est

 curr->next = head; 
     head = curr; 

ressemble plus le nom aurait été « prev » et non « à côté » la façon dont vous le faites (LIFO)

autrement si vous Vous voulez qu'une liste FIFO "normale" ait juste une tête ptr et une extrémité ptr, alors utilisez la fin ptr pour ajouter des éléments tout en gardant la tête pointant vers le premier élément de la liste.

+0

Merci. Mais cette chaîne est très déroutante pour un programmeur Java. int c qui contient la ligne qui a été lue, et peut être utilisé pour printf ("% S", c) imprime la ligne. Mais je ne peux pas remplacer yourstring avec c in = malloc (strlen (yourstring) +1); N'avez pas fini de comprendre le point de cstring – user265767

+1

int c contient seulement un caractère que vous avez lu, pas une chaîne. Dans C une chaîne est un tableau de caractères char [] + une position pour contenir le caractère de fin \ 0. Donc, si vous voulez lire une ligne à partir du fichier, vous utiliserez généralement un buffer: char buffer [maxlength], puis utilisez fgets (buffer, maxlength-1, handle de fichier) pour lire une ligne du fichier dans le buffer, faites le curr-> ord = malloc (maxlength) et copiez le buffer dans le spot alloué strcpy (curr-> ord, buffer). –

+0

Ok. Je veux changer quelques lettres dans les cstring de noeuds avant que j'imprime le cstring avec des lettres changées dehors, donc je veux avec une copie de boucle for le cstring à un autre cstring que je vais changer. mais je ne peux pas écrire char tmp [300] = curr-> ord; dans la boucle for. Isent curr-> ord un tableau char? et strcpy (nouveau cstring, curr-> ord) ne fonctionne pas. Comment puis-je copier curr-> ord en un caractère []? – user265767

0

Je vois votre problème dans l'autre. :)

Votre malloc de la structure n'est pas suffisant. Cette malloc crée seulement la mémoire de la mémoire de struct (deux pointeurs) pas la mémoire à l'intérieur. Vous devrez également déplacer votre mémoire char (ord) avec la bonne taille de la chaîne. Utilisez strlen et ajoutez-en un pour indiquer la taille de cette chaîne. au lieu

+0

Oui, parce que char * ord est un pointeur qui pointe sur une chaîne, maintenant je comprends. Pouvez-vous s'il vous plaît me montrer comment malloc char? – user265767

0
curr->ord = "some string" 

est exact!

+0

Mais pas ce que nous voulons: P – user265767