- ベストアンサー
バッファを消したいのですが・・
Cではバッファを消すために fflsuh(stdin) とすればできたいのですが、 C++ではどのようにバッファを消せばよいのでしょうか? ご教授のほどよろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#7です。 くどくなってきたので、この辺で終わりにします。 よく考えてみると、WinMainやwmainを処理系が予約するのはまずいですね。それだと規格厳密合致プログラムの動作を変更してしまいます。 というわけで、上記の場合は、少なくとも規格合致処理系とはいえないはずです。 未定義の動作は、文書化すれば、期待した動作になるように処理してもかまわないわけですが、それは任意の規格厳密合致プログラムの動作を変更しない場合に限られます。 fflushのような関数の機能を少し追加するのとは、やはりわけが違いますね。
その他の回答 (7)
- jacta
- ベストアンサー率26% (845/3158)
>#6 > C99は知りませんが、JIS-Cでは違います。 JIS-Cといわれているのがどのバージョンかわかりませんが、最新のJIS X3010:2003のことであれば、それはいわゆるC99すなわちISO/IEC 9899:1999に対応するものです。(これはJIS X3010:1999の最初のページを読めば分かります) 次に、Visual C++がどの規格バージョンをもとにしているかについてですが、これは__STDC_VERSION__マクロを調べれば分かります。すなわち、 ・__STDC_VERSION__が定義されない。→ C90 ・__STDC_VERSION__が199409L → C90 + AMD1 (C95) ・__STDC_VERSION__が199901L → C99 ということです。実際に調べてみると、__STDC_VERSION__は定義されていませんので、C90であろうと推測できます。 C90であれば、プログラムの開始はmainでなければならず、その返却型はint型でなければなりません。規格上、「~でなければならない」となっている事項が守られていない場合の動作は未定義ですので、確かに、文書化されていれば、返却型がvoidだろうが、WinMainやwmainであろうがOKといえばOKなのですが、それを言い出せば、文書化さえしていればC#の文法で書かれたソース(Cとしては未定義の動作)が、そのまま通用してもOKになってしまいますね。
- TT414
- ベストアンサー率18% (72/384)
ANo.4の >未定義の動作というのは、文書化された、環境特有の方法で処理してもよいことになっているので、Visual C++の場合はこれに相当するかと思います。 >(いや、mainの返却値がvoidでもよかったり、WinMain云々ということを考えると、そもそも非標準処理系なのか...) C99は知りませんが、JIS-Cでは違います。 「mainの返却値がvoidでもよかったり、WinMain云々」は未定義ではなく未規定です。 以下はJIS-Cからの引用 >3.4.4 未規定の動作 この規格が、二つ以上の可能性を提供し、個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。 > 例 未規定の動作の例としては、関数の実引数の評価順序がある。
- MrBan
- ベストアンサー率53% (331/615)
# undefined behaviorの定義は知ってますが、書き方が悪かったらしいです。 質問内容からVCをお使いなんだろうと勝手に推測してるわけですが、 ・VCは、なぜかそういう仕様を謳っている(VCの独自仕様では可能) ・C言語(一般)としては未定義動作 1.バッファを消す機能の仕様はない(一般には不可能⇒読み捨てる処理を書く) 2.結果の保証もない(他の意図しない結果をもたらす可能性)
- jacta
- ベストアンサー率26% (845/3158)
既に回答が出ているように、fflush(stdin)は未定義の動作になります。 (fflsuhはfflushの間違いですよね。本当にfflsuhという関数があるのなら、それについて補足してください。) 未定義の動作というのは、文書化された、環境特有の方法で処理してもよいことになっているので、Visual C++の場合はこれに相当するかと思います。 (いや、mainの返却値がvoidでもよかったり、WinMain云々ということを考えると、そもそも非標準処理系なのか...) したがって、そもそもCとしてはできないことなので、 > C++ではどのようにバッファを消せばよいのでしょうか? C++でそれに対応するものもありません。 ほとんど#3の回答と同じですが、処理系のマニュアルに記載されていれば、結果が保証されうることのみ指摘しておきます。
- MrBan
- ベストアンサー率53% (331/615)
istream/ostreamの回答は出てますので、もう少し根本的な指摘を。 誤解してそうな気もしますが、 fflush(stdin)はC言語の言語仕様(ISO/IEC9899)では「未定義動作」です。 なぜか、MicrosoftのVCは「バッファの内容を消去する」仕様を謳ってますが、 これはあくまでVC独自のものであって、C言語としてはfflushで入力バッファを消すことはできません。ご注意を。 # 未定義動作なので、そもそも結果が保証されません。
- koko_u_
- ベストアンサー率18% (459/2509)
istream の話なら istream::ignore(streamsize n, int delim) ではアカンの?ちゅうか入力ストリームをフラッシュする状況がわからん。
- osamuy
- ベストアンサー率42% (1231/2878)
ostreamでの話なら、 cout << flush; ――とか。