2014-04-21 7 views
0

Ligne 12 à 23 exécutions. Mais ne fonctionne pas réellement lorsque l'instruction if est ajoutée. il compile et fonctionne. Il demande à la première instruction printf de se terminer lorsque je choisis un caractère. Pourquoi cela se passe-t-il et comment puis-je y remédier?Pourquoi ce code compile-t-il mais ne fonctionne pas?

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

int main() 
{ 
    char ch, file_name[25]; 
    FILE *fp; 
    printf("Enter [A] and select file or [X] to exit:"); // Prompt user to select file or exit 
    scanf("%c",&ch); 
    scanf("%c",&ch); 

    if (ch=='A') 
    { 
     printf("Enter the file name\n"); // if user chooses 'A' this code should run 
     gets(file_name); 

     fp = fopen(file_name,"r"); // reading file 

     if(fp == NULL) 
     { 
      perror("File not found.\n"); 
      exit(EXIT_FAILURE); 
     } 
     printf("Contents of %s are:\n", file_name); 

     while((ch = fgetc(fp)) != EOF) 
      printf("%c",ch); 
    } 
    else if (ch=='X') 
    { 
     printf("Exiting program..."); 
     exit(0); 
    } 
} 
+0

Pourquoi un code compilable devrait-il fonctionner? Un code d'erreur non-syntaxique ne signifie pas qu'il n'a pas d'erreur logique –

Répondre

0

Il existe une grande classe de programmes qui se compilent mais ne fonctionnent pas correctement. C'est pourquoi une distinction est faite entre les erreurs de syntaxe et les erreurs d'exécution/logique.

scanf("%c",&ch); 
scanf("%c",&ch); 

Je en supposant qui est de se débarrasser du caractère de nouvelle ligne, mais il est une mauvaise idée de le lire dans ch, puisque cela devrait garder le premier caractère.

Si tel est le cas, il suffit de le lire dans une variable indésirable afin que ch soit préservée.

char ch, junk, file_name[25]; 
: 
scanf("%c",&ch); 
scanf("%c",&junk); 

Malheureusement, il peut y avoir de nombreux autres problèmes avec cette approche. Si vous voulez une fonction d'entrée de ligne décente, vous pouvez en trouver une here. C'est beaucoup mieux que d'utiliser gets(), ce qui est intrinsèquement dangereux.

Il a la détection et la prévention de débordement de tampon, rinçage automatique des lignes d'entrée où trop long, sortie rapide et ainsi de suite. Une fois que vous avez utilisé pour obtenir une ligne d'entrée, tout ce que vous devez faire est de comparer avec ce que vous voulez, quelque chose comme:

if (strcmp (buff, "A") == 0) 
    doSectionA(); 
else 
    if (strcmp (buff, "X") == 0) 
     doSectionX(); 
+0

merci man. Je vais chercher dans l'utilisation de fgets au lieu de – user3555512

1

Parce que vous avez deux appels à scanf ..

Dans le Premièrement, vous lisez votre entrée 'A' ou 'X' avec succès. Lors de l'appel suivant, vous lisez le caractère de nouvelle ligne (\n) qui a été enfoncé précédemment dans la même variable ch. Donc, il ne fait pas satisfaire toute clause if et vient simplement du programme ..

lieu deuxième appel à la variable temporaire ..

char temp; 
scanf("%c", &temp); 

également fgets est préféré sur gets

+0

Merci beaucoup. Il fait le travail maintenant. – user3555512

0

Je suppose que vous ne lisent pas correctement à partir du fichier, Essayez:

char buff[255]; //define buffer to read lines 

while (!feof(fp)){ 
     memset(buff, '\0', sizeof(buff)); 
     fgets(buff, 255, (FILE*)fp); 
     printf("%s", buff); 
     } 

fclose(fp); //don't forget to close 
Questions connexes