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