2016-11-03 5 views
1

Je suis novice en programmation C et j'essaye actuellement de lire une ligne de stdin en utilisant fgets(), mais j'ai des problèmes avec l'allocation de mémoire car j'utilise un char * pour pointer vers la chaîne que je veux lire. Lorsque j'exécute le fichier, il signale une erreur de segmentation.Lecture depuis stdin en utilisant fgets()

C'est la fonction que je utilise:

char *read_line(char *line){ 
    printf("%s",PROMPT); 
    line = (char*)malloc(sizeof(char)*500); 
    fgets(line,sizeof(line),stdin); 
    printf("%s","pasa el fgets"); 
    return line; 
} 

Et mon principal:

void main(){ 
    char line0; 
    char *line=&line0; 
    while(read_line(line)){ 
     execute_line(line); 
    } 
} 
+0

'char line0; char * line = &line0; 'Maintenant' line' pointe vers un tampon 'char' de longueur 1. Si votre ligne a une longueur de plus de 1 octet, le buffer sera surchargé. Au lieu de simplement bloquer le code jusqu'à ce qu'il compile, essayez de réellement * comprendre * ce qu'il fait. Je recommanderais un tutoriel C, un livre ou un cours. –

+1

Tant d'erreurs dans si peu de lignes de code ;-) –

+2

'sizeof (line)' est la taille d'un pointeur, pas la taille de la mémoire allouée. – chux

Répondre

2

L'erreur principale est de passer le pointeur line à la fonction read_line (en valeur) et essayer pour le modifier dans cette fonction.

read_line alloue la mémoire et crée réellement la valeur du pointeur. Il doit donc être en mesure de changer la valeur de line dans main:

char *read_line(char **line){ 
    ... 
    *line = malloc(500); 
    fgets(*line, 500, stdin); 
    ... 
    return *line; 
} 

int main(void) { 
    char *line; 
    while(read_line(&line)){ 
     ... 
    } 

} 

Ou, vous utilisez la valeur de retour de read_line afin de modifier l » linemain. Dans ce cas, vous n'avez pas besoin du paramètre du tout:

char *read_line(void) { 
    char *line; 
    ... 
    line = malloc(500); 
    fgets(line, 500, stdin); 
    ... 
    return line; 
} 

int main(void) { 
    char *line; 
    while(line = read_line()){ 
     ... 
    } 
} 

erreurs supplémentaires (signalées par Jonathon Reinhart) et remarques:

  1. sizeof n'a pas « travail » pour les pointeurs (tableau cariées à pointeurs).
  2. Vous malloc beaucoup de chaînes line mais vous ne les free eux.
  3. sizeof(char) est toujours 1.
  4. Certaines personnes (moi aussi) pensent que le résultat de malloc devrait être évité.