[解決済み] C言語で入力バッファをクリアするには?
質問
次のようなプログラムがあります。
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つの方法を提案しました。
-
使用
fflush()
-
は、このような関数を書きます。
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より)ご覧ください。
-
保留中の入力をフラッシュして、次のプロンプトでユーザーの typeahead を読み込まないようにするにはどうしたらよいでしょうか。ウィル
fflush(stdin)
は機能しますか? -
もし
fflush
がうまくいかない場合は、何を使って入力をフラッシュすればいいのでしょうか?
を行うことが、基本的に唯一のポータブルなアプローチであると述べています。
int c;
while ((c = getchar()) != '\n' && c != EOF) { }
あなたの
getchar() != '\n'
を呼び出すと、ループが機能するようになります。
getchar()
このとき、返された文字はすでに入力ストリームから削除されています。
また、私は、あなたが
scanf
完全に
を使うなと皆が言うのはなぜか?
scanf
? 代わりに何を使うべきですか?
関連
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] struct has no member named
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】malloc():メモリ破壊
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Mac OS Xのターミナルで、前の出力をクリアするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】malloc():メモリ破壊
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み】配列型char[]が代入できない [重複]。