2016-09-16 13 views
1

while() `loopというものを使用しています。scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in theループ内でなぜ%dのscanf()が無効な入力を受け取った場合にユーザ入力を待つのはなぜですか?

私の知る限り、test = scanf("%d", &testNum);は、数字を受け取った場合は1を、そうでない場合は0を返します。

マイコード:

#include<stdio.h> 

int main(void) { 
    while (1) { 
     int testNum = 0; 
     int test; 
     printf("enter input"); 
     test = scanf("%d", &testNum); 
     printf("%d", test); 
     if (test == 0) { 
      printf("please enter a number"); 
      testNum = 0; 
     } 
     else { 
      printf("%d", testNum); 
     } 
    } 
    return(0); 
} 

答えて

1

問題ここでは、無効入力、(例えば文字を、)encountring時に、誤入力がを消費しないされ、それは入力バッファに残っています。

したがって、次のループでは、同じ無効入力が再びscanf()によって読み取られます。

誤った入力を識別した後でバッファをクリーンアップする必要があります。非常に単純なアプローチは、testを初期化する、または明示的に初期化されない限り、testが自動変数であるとして、printf("%d", test);を削除いずれか、前記

if (test == 0) { 
     printf("please enter a number"); 
     while (getchar() != '\n'); // clear the input buffer off invalid input 
     testNum = 0; 
    } 

なり、不定値が含まれています。 undefined behaviorを呼び出すことができる使用を試みます。

つまり、ちょうどニッチピキreturnは、1つのように見えません。それはステーメートなので、return 0;は、はるかに穏やかで、目立たず、あまり混乱しません。

+1

これはうまくいきました。ありがとうございました! – bubba

+1

'while(getchar()!= '\ n');'はファイルの終わりの条件に無限ループすることに注意してください。 – chux

関連する問題