ページ 1 / 1
標準入力をフラッシュ
Posted: 2008年5月01日(木) 22:52
by ルファー
こんばんは。いつかここで質問したルファーです。
今度はコンソールプログラムの質問です。
以下のコードを実行するとどうなりますか?
fflush(stdin); /* つまり標準入力をフラッシュする */
Re:標準入力をフラッシュ
Posted: 2008年5月02日(金) 00:21
by YuO
fflushは「出力ストリームのバッファを書き出す」関数です。
入力ストリームに対して適用した場合は,未定義動作となります。
# というか未定義動作の例とされる典型です。
Re:標準入力をフラッシュ
Posted: 2008年5月02日(金) 02:05
by Ban
言語仕様としては、既にご指摘の通り、未定義動作。
何がおきても保証されません。
エラーかもしれないし、予期せぬ動きかもしれないし、
一見正常に動くかもしれないし、プログラムが落ちるかもしれないし…
どうなるか分からない、書いてはいけないコードです。
その上で、もしもVCを使っているならば、
入力バッファがクリアされることになります。
# 特定の環境で、一見正常に動作してもかまわないので、
# VCは特殊。他のコンパイラではおかしくなる可能性大。
Re:標準入力をフラッシュ
Posted: 2008年5月03日(土) 12:24
by ルファー
なるほどー。
今標準ライブラリ関数だけでツールを作ってるんですが、
「指定された文字を受け取るまでループ」するところでgetchar()を使うと、
「指定されていない文字」を受け取った時の動作が変になります。
どうすればいいですか?
Re:標準入力をフラッシュ
Posted: 2008年5月03日(土) 15:03
by tk-xleader
scanfのスキャン何とか(名前忘れました)とか言うのを使えばいいはずです。
char str[101]={0};
scanf("%100[^\n]%*c",str);/*改行文字のところに読み込みを終了する文字を入れる(複数指定可能)*/
こんな感じで。
Re:標準入力をフラッシュ
Posted: 2008年5月03日(土) 15:08
by バグ
環境がWindowsに限定されるので趣旨から外れてしまいますが…
kbhit関数が使えるかもしれません。
Re:標準入力をフラッシュ
Posted: 2008年5月04日(日) 14:43
by ルファー
返信遅れました。
scanf("%100[^\n]%*c",str)の100は何の意味があるんですか?
Re:標準入力をフラッシュ
Posted: 2008年5月04日(日) 15:52
by tk-xleader
101バイトしか文字配列を用意していないので、入力を100文字(ASCIIで)に限定するという意味です。
Re:標準入力をフラッシュ
Posted: 2008年5月04日(日) 19:17
by ルファー
ありがとうございます。
コマンドプロンプトは例外が無ければ横幅は皆80文字だから79文字までならgetchar()のようなバグが起こらないように調整しました。
よく考えたら「文字列」ではなく「文字」で分岐するのでfgets(str, 100, stdin)でも大丈夫かなと思ってやっていたらOKでした・・・。