プロが教える店舗&オフィスのセキュリティ対策術

while文中のscanf関数が意図しない動作をして困っています
簡略化したコードがこちらになります
while(1){
// view
printf("view\n");
// input
char key;
scanf("%c", &key);
// update
printf("update\n");
}

行いたい動作というのは単純で
view -> input -> update ->を繰り返したいだけなのですが
上記プログラムでは下記のような動作になってしまいます
view -> input -> update -> view -> update -> view -> input ->
偶数回目のループでは、inputが飛ばされてしまうのですが、何が原因なのかかがわかりません。

言語仕様に詳しい方、どなたかご教示ください。

環境
WindowsXP
Visual C++ 2008 ExpressEdition

A 回答 (3件)

scanf()を使用していることに対しての弊害ですね。


scanf()はリターンキーの直前までの入力をキーバッファから取得します。
キーバッファにはリターンキーが残ったままとなっている為、次のscanf()でバッファに残ったものが取り込まれてしまう為に発生する問題です。
「printf("update\n");」の部分でブレークをかけて「key」の入力内容を確認すればわかりますが、偶数回目にはリターンキーのコードが取得されています。
scanf("%c", &key);
scanf( "%*[^\n]" );
のように、取得した内容以降のバッファの読み飛ばしを追加するか
scanf()以外の入力関数でを使用することで回避します。
    • good
    • 0
この回答へのお礼

詳しい仕様、解決法をありがとうございます
偶数回目では改行コードを読んでしまっていたんですね
iostreamを使うのは(何故か)少し抵抗があるのですが、cinを使うことにします。
ありがとうございました。

お礼日時:2009/07/08 12:28

inputの時に「何も文字を入力しないで、Enterキーだけ押す」と、毎回inputします。



これは「毎回scanfで改行を読み込むため、毎回キーバッファが空になるので、毎回キー入力待ちする」からです。

入力の時に1文字じゃなく「abcdefghijk」「Enter」と押せば、偶数回どころの騒ぎじゃなく、改行を含めた11回分inputがスキップされ、キー入力待ちになりません。

「1文字入力してEnterキー」は「Enterを含めて2文字入力している」のですから、scanfが入力済みの2文字分をすべて取り出さないかぎり、キー入力待ちにはなりません。
    • good
    • 0

詳しくないし,検証もしてないけど


こんな話を聞いたような。

http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4-2

#なんでこんな仕様になっているんでしょうね
    • good
    • 0
この回答へのお礼

参考urlありがとうございます、納得しました。

お礼日時:2009/07/08 12:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!