1. ホーム
  2. c

[解決済み] C言語で入力バッファをクリアするには?

2022-03-03 23:33:17

質問

次のようなプログラムがあります。

int main(int argc, char *argv[])
{
  char ch1, ch2;
  printf("Input the first character:"); // Line 1
  scanf("%c", &ch1); 
  printf("Input the second character:"); // Line 2
  ch2 = getchar();

  printf("ch1=%c, ASCII code = %d\n", ch1, ch1);
  printf("ch2=%c, ASCII code = %d\n", ch2, ch2);

  system("PAUSE");  
  return 0;
}

上記のコードの作者が説明しているように 1行目で、ユーザーがEnterキーを押したときに、入力バッファに2文字を残してしまうため、プログラムが正しく動作しません。 Enter key (ASCII code 13)\n (ASCII code 10) . したがって、2行目では、読み込まれるのは \n で、ユーザーが文字を入力するのを待たない。

OK、これを手に入れました。しかし、最初の疑問は、なぜ2番目の getchar() ( ch2 = getchar(); ) は読み込まれません。 Enter key (13) よりも、むしろ \n 文字ですか?

次に、このような問題を解決するための2つの方法を提案しました。

  1. 使用 fflush()

  2. は、このような関数を書きます。

    void
    clear (void)
    {    
      while ( getchar() != '\n' );
    }
    
    

このコードは実際に動作しました。しかし、どのように動作するのか自分では説明できないのですが?なぜなら、while文の中で getchar() != '\n' 以外の任意の一文字を読み取ることを意味します。 '\n' もしそうなら、入力バッファにはまだ '\n' 文字ですか?

どのように解決するのですか?

<ブロッククオート

1行目で、ユーザがEnterキーを押したときに、入力バッファに2文字残ってしまうため、プログラムが正常に動作しません。Enterキー(ASCIIコード13)と▼n(ASCIIコード10)の2文字が入力バッファに残ります。 そのため、Line 2では "the \n "を読み込んでしまい、ユーザーが文字を入力するのを待たないのです。

2行目に見える動作は正しいのですが、これは正しい説明とは言えません。 テキストモードのストリームでは、プラットフォームがどのような行末を使用するかは問題ではありません(キャリッジリターン(0x0D)+ラインフィード(0x0A)、素のCR、素のLFのいずれであっても)。 Cランタイムライブラリがそれを処理します。 '\n' は改行です。

文字を入力してエンターキーを押した場合、その入力文字は1行目で読み込まれ、その後 '\n' は2行目で読み込まれます。 参照 を使っています。 scanf %c でY/Nのレスポンスを読み取るが、後の入力はスキップされる。 comp.lang.cのFAQより。

解決案については、(再びcomp.lang.c FAQより)ご覧ください。

を行うことが、基本的に唯一のポータブルなアプローチであると述べています。

int c;
while ((c = getchar()) != '\n' && c != EOF) { }

あなたの getchar() != '\n' を呼び出すと、ループが機能するようになります。 getchar() このとき、返された文字はすでに入力ストリームから削除されています。

また、私は、あなたが scanf 完全に を使うなと皆が言うのはなぜか? scanf ? 代わりに何を使うべきですか?