私はこの問題に行き詰まっています。問題の要件は非常に単純です。私がしたいのは、ユーザー入力をチェックして、ユーザーが小文字のみを入力できるようにすることだけです。もう 1 つの制約は、scanf() のみを使用して実行したいということです。gets() やその他の入力関数を使用できることはわかっていますが、理解を深めるために、scanf() を使用したいと思います。
GCCで次のことを試しました:
char str[100000];
return_value=scanf("%99999[a-z]",str);
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
以下は、期待どおりに完全に機能します。したがって、ユーザーが大文字で文字列を入力しようとすると、コードは単に「不正な入力」と出力します。
上記のコードを有限 while ループに入れようとすると、問題が発生します。例えば:
int counter=0;
char str[100000];
scanf("%2d",&counter);
while(counter>0)
{
fflush(stdin);
return_value=scanf("%99999[a-z]",str); //note
if(return_value==0 || return_value==EOF)
{
printf("illegal input");
}
else
printf("input accepted");
counter--;
}//end of while
上記の場合、ユーザーが変数「カウンター」の値を入力してリターン キーを押すとすぐに、ユーザーが文字列を入力するのを待たずに、コントロールはすぐに「不正な入力」を出力します。
このエラーを修正するために、メモとしてマークされた行の代わりに次を入れてみました。
return_value=scanf("%99999s[a-z]",str); //note
またはこれさえ:
return_value=scanf("%99999c[a-z]",str); //note
どちらの場合でも、ユーザーは「カウンター」変数の値を入力した後に入力文字列を入力できますが、ユーザー入力のサニタイズは行われません。つまり、ユーザーが大文字で構成される文字列を入力しても、出力は「不正な入力」にはなりません。 」(そうあるべきだった)ではなく、「入力が受け入れられました」。
誰かが私にこれを説明してくれませんか。どこが間違っているのでしょうか、それとも単に何かを見落としてばかげた間違いを犯しているのでしょうか?