• ベストアンサー

whileとscanfの関係について

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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

fumihio
質問者

お礼

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

その他の回答 (2)

回答No.3

inputの時に「何も文字を入力しないで、Enterキーだけ押す」と、毎回inputします。 これは「毎回scanfで改行を読み込むため、毎回キーバッファが空になるので、毎回キー入力待ちする」からです。 入力の時に1文字じゃなく「abcdefghijk」「Enter」と押せば、偶数回どころの騒ぎじゃなく、改行を含めた11回分inputがスキップされ、キー入力待ちになりません。 「1文字入力してEnterキー」は「Enterを含めて2文字入力している」のですから、scanfが入力済みの2文字分をすべて取り出さないかぎり、キー入力待ちにはなりません。

回答No.1

詳しくないし,検証もしてないけど こんな話を聞いたような。 http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4-2 #なんでこんな仕様になっているんでしょうね

fumihio
質問者

お礼

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