2016-10-27 3 views
0

Je suis en train de réécrire le code du Jeu de devinettes de 'Programmation C pour les débutants Absoulute' pour vérifier que l'utilisateur a entré un chiffre, en utilisant la fonction isdigit().Comment puis-je faire passer mon code dans une boucle infinie?

Le reste du code fonctionne, en termes de vérification d'erreur; mais le moment où l'utilisateur entre dans un non-chiffre, le code va dans une boucle infinie.

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

#define NO 2 
#define YES 1 

main() 

{ 
    int guessGame;  
    guessGame = 0; 

    int iRandomNum = 0; 
    int iResponse = 0; 

    printf("\n\nWould you like to play \"The Guessing Game\"?\n\n"); 
    printf("\nType '1' for Yes or '2' for No!\n\n"); 
    scanf("%d", &guessGame); 

    do{ 
     if(guessGame == YES){ 
      iRandomNum = (rand() % 10) + 1; 

      printf("\nGuess a number between 1 and 10:\n\n "); 
      scanf("%d", &iResponse); 

      if(!isdigit(iResponse)){ 
       printf("\nThank you\n"); 
       printf("\nYou entered %d\n", iResponse); 
       if(iResponse == iRandomNum){ 
        printf("\nYou guessed right\n"); 
        printf("\nThe correct guess is %d!\n", iRandomNum); 
        printf("\nDo you wish to continue? \n"); 
        printf("\nType '1' for Yes or '2' for No!\n\n"); 
        scanf("%d", &guessGame); 

       } else { 
        printf("\n\nSorry, you guessed wrong\n"); 
        printf("\nThe correct guess was %d!\n", iRandomNum); 
        printf("\n\nDo you wish to continue? \n"); 
        printf("\nType '1' for Yes or '2' for No!\n\n"); 
        scanf("%d", &guessGame); 

       } 
      } 
      else { 
       printf("\nYou did not enter a digit\n"); 
       printf("\n\nPlease enter a number between 1 and 10:\n\n"); 
       scanf("%d", &iResponse); 
      } 
     } 
     else { 
      printf("\nThe window will now close. Try again later!\n"); 
      exit(0); 
     } 
    }while(guessGame != NO); 
} 
+0

Qu'est-ce que débogueur avez-vous utilisé passer à travers cela? –

+0

ne devrait pas 'if (! Isdigit (iResponse))' être 'if (isdigit (iResponse))'? si en effet il vérifie un chiffre .. – davedwards

+0

@Ben Je n'ai pas encore utilisé de débogueur pour passer le code. J'utilise DevC++ pour l'écrire et le compiler. Mais, malheureusement, le débogueur ne fonctionne pas en mode atm et je n'ai pas encore trouvé de solution pour le faire fonctionner. Des idées? – aLoHa

Répondre

1

Essayer de prendre l'entrée sous la forme de chaîne .. également u aura pour comparer l'entrée sous la forme « number » :)

4

Le code passe en boucle infinie comme scanf() est incapable lire un entier. Le caractère que vous avez entré reste dans le tampon du clavier. Aucune lecture supplémentaire des entiers n'est possible tant que le caractère est présent dans le tampon. scanf() renvoie simplement le nombre d'éléments lus comme 0 à chaque fois. Par conséquent, le programme n'attend pas que l'utilisateur entre des données et des résultats de boucle infinie. Scanf() renvoie le nombre d'éléments lus avec succès.

Ainsi, vous pouvez simplement vérifier la valeur de retour de scanf(), si son 1 alors scanf() a correctement lu un entier.

check = scanf("%d", &iResponse); 

    if(check == 1){ 
     printf("\nThank you\n"); 
     printf("\nYou entered %d\n", iResponse); 

et vider la mémoire tampon en cas d'erreur d'entrée est entré

 else { 
      while (getchar() != '\n'); //flush the buffer 
      printf("\nYou did not enter a digit\n"); 
      printf("\n\nPlease enter a number between 1 and 10:\n\n"); 
      //scanf("%d", &iResponse); 
     } 

pas besoin de demander l'entrée ici, tandis que la boucle continue et demander une entrée au début

+0

Merci pour votre commentaire @Hardik. Il traite certainement de mon problème de boucle infinie, ce qui est très apprécié. Cependant, en ce qui concerne votre commentaire que scanf() est incapable de lire un entier, pouvez-vous m'expliquer pourquoi ce problème ne s'est pas produit dans la boucle externe: scanf ("% d", & guessGame) ;? De plus, existe-t-il un moyen d'accomplir la même tâche, en utilisant la fonction isdigit()? – aLoHa

+0

Vous avez initialisé guessGame = 0; donc pour la boucle externe, quand une entrée invalide est entrée, scanf() ne pourra pas lire. Donc guessGame est toujours 0. Puis à l'intérieur de la boucle, check est présent si (guessGame == YES) d'où il sortira de la boucle et l'exécution s'arrêtera. –

+0

Utilisez un débogueur, vous pouvez comprendre/résoudre tous vos problèmes en l'utilisant. –