scanfの不正文字入力のチェックと処理について

1794 ワード

関数scanf()は、パラメータタイプのマッチングチェックを行わないため、ユーザ入力データタイプがフォーマット文字と一致しない場合、コンパイラはエラーメッセージを提示しないが、データを正しく入力できない!
#include <stdio.h>

main()

{int a,b;

printf("input a:");

scanf("%d",&a);

printf("a=%d",a);

printf("input b:");

scanf("%d",&b);

printf("b=%d",b);
}

1回目のテストプログラムの実行結果:
input a:1.4
a=1
input b:b=3129
2回目の実行結果
input a:q
a=64
input b:b=3129——————————————————
どうやってこの問題を解決しますか?
次の手順を参照してください.
#include <stdio.h>

int main(int argc, char* argv[])
{
int a,b,ret;
printf("Input a:");
ret=scanf("%d",&a);
if(ret==0)    //         
{
   printf("Input data type error!
"); fflush(stdin);// } else if(ret==EOF)//scanf { printf("Input failure occurs!
"); } else { printf("a=%d
",a); } printf("Input b:"); ret=scanf("%d",&b); if(ret==0) { printf("Input data type error!
"); fflush(stdin); } else if(ret==EOF) { printf("Input failure occurs!
"); } else { printf("b=%d
",b); } return 0; }
この問題を解決し、関数scanf()が戻り値を呼び出す方法を検討できます.関数scanf()が正常に呼び出されると、その戻り値は正常に読み込まれたデータ項目数になります.通常、不正な文字の入力により、データが正常に読み込めません.scanf()呼び出しに失敗すると、EOFが返され、通常はデータなしで読み取り可能である.例えば、標準入力が入力ファイルにリダイレクトされた場合、プログラム実行関数scanf()は、ファイルの最後にデータが読み取り可能でない場合、関数scanfである.()呼び出しは無効となり,ユーザがF 6キーを押す強制入力が終了すると,テスト関数scanf()の戻り値もEOFとなる.