2016-10-27 11 views
0

私はisdigit()関数を使用してユーザが数字で入力したことを確認するために、 'Absoulute BeginnersのためのCプログラミング'から推測ゲームコードを書き直しています。コードをinfinteループに入れる方法を教えてください。

残りのコードは、エラーチェックの点で機能します。ユーザーが非数字で入力した瞬間、コードは無限ループに入ります。

文字列の形式で入力を服用しようと
#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

、ここに入力をお願いする必要

 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); } 

を入力しない場合は、バッファをフラッシュしますこれを進める? –

+0

は 'if(isdigit(iResponse))'を 'if(isdigit(iResponse))'にしてはいけませんか?確かにそれが数字をチェックしているなら。 – davedwards

+0

@Ben私はまだコードを踏んでいくためにデバッガを使いませんでした。私はDevC++を使ってそれを書いてコンパイルしています。しかし、残念なことに、デバッガはatmで動作していないので、私はそれを動作させるために解決策を探すのに慣れていません。何か案は? – aLoHa

答えて

1

..また、uは形で入力を比較しなければならない「数」:)

4

コードは、(scanf関数として無限ループになる)ができません整数を読み込む。入力した文字はキーボードバッファーに残ります。文字がバッファーにある限り、整数の読み取りは可能ではありません。 scanf()は、毎回0として読み取られた項目の数を返します。したがって、プログラムはユーザーがデータを入力し、無限ループの結果を待つことはありません。

scanf()は正常に読み取られた項目の数を返します。したがって、scanf()が整数を正しく読み取った場合、scanf()の戻り値を確認することができます。

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

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

とループが初めに継続し、入力を要求されますしながら、間違った入力が何デバッガを使用していた

+0

コメントありがとう@Hardik。私の無限ループの問題を扱うことは確かです。非常に感謝しています。しかし、scanf()が整数を読み取ることができないというあなたのコメントに関して、なぜこの問題が外側のループで起こらなかったのかを教えてください:scanf( "%d"、&guessGame);さらに、isdigit()関数を使用して同じタスクを実行する方法がありますか? – aLoHa

+0

あなたはguessGame = 0を初期化しました。外側ループの場合、無効な入力が入力された場合、scanf()は読み取ることができません。したがって、guessGameはまだ0です。ループの中でループが出てどこから抜けて実行が止まるかをチェックする(guessGame == YES)かどうかのチェックがあります。 –

+0

デバッガを使用すると、デバッガを使用して問題をすべて理解/解決できます。 –

関連する問題