今日も同様の問題があり、うまくいくように見える方法を見つけました。私はあなたの状況の詳細を知らないので、あなたに合うかどうかわかりません。
キーボードから単一の文字を取得する必要があるルーチンを作成しています。これは、3 つの特定のキーストローク ('1'、'2'、または '3') のいずれかである必要があります。それらのいずれでもない場合、プログラムはエラーメッセージを送信し、もう一度試行するためにループバックする必要があります。
問題は、入力した文字が getchar() によって返されることに加えて、'Enter' キーストローク (キーストロークをプログラムに送信する) が入力バッファに保存されることです。その (非印刷) 改行文字は、エラー修正ループの getchar() 機能によって返され、さらに 2 番目のエラー メッセージが表示されます (改行文字は「1」でも「2」でもないため)。 、「3」でもありません。)
この問題はさらに複雑です。なぜなら、私はときどき先を行ってしまい、1 文字を入力する代わりに、これらのオプションの 1 つが要求するファイル名を入力するからです。次に、バッファーに不要な文字列全体が含まれているため、画面を下にスクロールするエラーメッセージの長いリストが表示されます。
クールではありません。
ただし、それを修正したように見えるのは次のとおりです。
c = getchar(); // get first char in line
while(getchar() != '\n') ; // discard rest of buffer
最初の行は、私が入力した文字を実際に使用する行です。2 行目では、入力バッファーに残っている残留物をすべて破棄します。入力バッファから一度に 1 文字ずつプルするループを作成するだけです。ステートメントのループ中に実行するアクションは指定されていません。単純に文字を読み取り、それが改行でない場合は次の行に戻ります。改行が見つかると、ループが終了し、プログラム内の次の作業に進みます。