標準入力をフラッシュ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルファー

標準入力をフラッシュ

#1

投稿記事 by ルファー » 17年前

こんばんは。いつかここで質問したルファーです。
今度はコンソールプログラムの質問です。

以下のコードを実行するとどうなりますか?

fflush(stdin); /* つまり標準入力をフラッシュする */

YuO

Re:標準入力をフラッシュ

#2

投稿記事 by YuO » 17年前

fflushは「出力ストリームのバッファを書き出す」関数です。
入力ストリームに対して適用した場合は,未定義動作となります。
# というか未定義動作の例とされる典型です。

Ban

Re:標準入力をフラッシュ

#3

投稿記事 by Ban » 17年前

言語仕様としては、既にご指摘の通り、未定義動作。
何がおきても保証されません。
エラーかもしれないし、予期せぬ動きかもしれないし、
一見正常に動くかもしれないし、プログラムが落ちるかもしれないし…
どうなるか分からない、書いてはいけないコードです。

その上で、もしもVCを使っているならば、
入力バッファがクリアされることになります。
# 特定の環境で、一見正常に動作してもかまわないので、
# VCは特殊。他のコンパイラではおかしくなる可能性大。

ルファー

Re:標準入力をフラッシュ

#4

投稿記事 by ルファー » 17年前

なるほどー。

今標準ライブラリ関数だけでツールを作ってるんですが、
「指定された文字を受け取るまでループ」するところでgetchar()を使うと、
「指定されていない文字」を受け取った時の動作が変になります。
どうすればいいですか?

tk-xleader

Re:標準入力をフラッシュ

#5

投稿記事 by tk-xleader » 17年前

scanfのスキャン何とか(名前忘れました)とか言うのを使えばいいはずです。

char str[101]={0};
scanf("%100[^\n]%*c",str);/*改行文字のところに読み込みを終了する文字を入れる(複数指定可能)*/

こんな感じで。

バグ

Re:標準入力をフラッシュ

#6

投稿記事 by バグ » 17年前

環境がWindowsに限定されるので趣旨から外れてしまいますが…

kbhit関数が使えるかもしれません。

ルファー

Re:標準入力をフラッシュ

#7

投稿記事 by ルファー » 17年前

返信遅れました。
scanf("%100[^\n]%*c",str)の100は何の意味があるんですか?

tk-xleader

Re:標準入力をフラッシュ

#8

投稿記事 by tk-xleader » 17年前

101バイトしか文字配列を用意していないので、入力を100文字(ASCIIで)に限定するという意味です。

ルファー

Re:標準入力をフラッシュ

#9

投稿記事 by ルファー » 17年前

ありがとうございます。

コマンドプロンプトは例外が無ければ横幅は皆80文字だから79文字までならgetchar()のようなバグが起こらないように調整しました。


よく考えたら「文字列」ではなく「文字」で分岐するのでfgets(str, 100, stdin)でも大丈夫かなと思ってやっていたらOKでした・・・。

閉鎖

“C言語何でも質問掲示板” へ戻る