2017-04-18 3 views
0

私は整数入力を必要とするプログラムに取り組んでいますが、非整数が誤って入力されるたびに、scanf関数は動作を停止するか、ループでスタックされます。 scanfを使用して整数のみを入力しますか?

この

は私がしようとしたものの一例である:

int n; 
    printf("please enter 0 or 1\n"); 
top: 
    scanf("%i",&n); 
    if(n == 0) 
    { 
     printf("you entered 0!\n"); 
    } 
    if(n == 1) 
    { 
     printf("you entered 1!\n"); 
    } 
    if(n != 0 && n != 1) 
    { 
     printf("please enter either 0 or 1."); 
     goto top; 
    } 

第三に、あなたが右の番号を入力していない場合には、先頭に戻ってあなたを送信している場合、これは文字では動作しません。その他の文字。 整数でない入力があった場合、どのように先頭に戻すことができますか?

+1

ダッジにそれを試してみてください(マニュアルページを調べてください: 'scanf'ファミリーの関数戻り値は何ですか?)必要なものが得られない場合は、入力文字列をダンプして別の文字列を取得してください。 –

+1

"非整数入力が与えられた場合、どのように先頭に戻すことができますか?" - >非整数を読み取り、最初にそれを投げ捨てる。 – chux

+0

'scanf()'の戻り値をチェックして、入力が数値でないなどエラーが発生したときを認識する必要があります。このようなマッチングエラーが発生すると、標準入力から少なくとも1文字を読み込まなければなりません。つまり、 'scanf()'が現在窒息しています。そうでなければ、次の試行で問題を引き起こします。 –

答えて

0

これは、以下でscanf("%i",&n);の呼び出しを置き換えることによって解決することができます。

char buffer[256]; 
char *s = fgets(buffer, 256, stdin); 

if (s != buffer) 
{ 
    // Some error occurred 
    goto top; 
} 

int error = sscanf(buffer, "%i", &n); 

if (error == 0) 
{ 
    // The string read is not a number! 
    printf("please enter either 0 or 1."); 
    goto top; 
} 
0

fgets` `と入力すると` sscanf`を適用し、その戻り値をチェックすることで、この

#include <stdio.h> 

int main(void){ 
    int n; 
    printf("please enter 0 or 1\n"); 

    for(;;){ 
     int status; 
     char ch; 
     status = scanf("%i%c", &n, &ch);//check return value of scanf, ch : for check rest input 
     if(status == EOF){ 
      printf("Bye!!\n", n); 
      return 0; 
     } else if(status == 2 && ch == '\n'){ 
      if(n == 0 || n == 1){ 
       printf("you entered %i!\n", n); 
       break; 
      } 
     } else { 
      while(getchar() != '\n');//clear input 
     } 
     printf("please enter either 0 or 1.\n"); 
    } 
    return 0; 
} 
関連する問題