2

私はこの問題に行き詰まっています。問題の要件は非常に単純です。私がしたいのは、ユーザー入力をチェックして、ユーザーが小文字のみを入力できるようにすることだけです。もう 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

どちらの場合でも、ユーザーは「カウンター」変数の値を入力した後に入力文字列を入力できますが、ユーザー入力のサニタイズは行われません。つまり、ユーザーが大文字で構成される文字列を入力しても、出力は「不正な入力」にはなりません。 」(そうあるべきだった)ではなく、「入力が受け入れられました」。

誰かが私にこれを説明してくれませんか。どこが間違っているのでしょうか、それとも単に何かを見落としてばかげた間違いを犯しているのでしょうか?

4

2 に答える 2

2

fflush()クリアするのに不適切な方法stdinです。代わりに、scanfまでEOFまたは単に読むために使用します

while((c = getchar()) != '\n' && c != EOF) { /* Discard */ }

また、elseのような単一のステートメントでもスコーピングすることをお勧めします。

于 2012-09-16T11:52:37.017 に答える
1

あなたは何度も何度も悪い入力を読み込もうとしています。たとえば、1文字をスキップする場合は、ユーザーが不正な入力を入力した場合に実行する必要があります。- scanf("%.*s")>これにより、次の\nまですべてがスキップされます。

説明:scanf()が失敗した場合、何も読み取られません。したがって、再度読み取ろうとすると、以前に失敗したのと同じ場所から開始されます。

于 2012-09-16T11:40:40.757 に答える