システムポーズを使用することのデメリットは何ですか?


ベストアンサー

これは、C ++を失格にするに対する私のお気に入りの質問の1つです。エキスパート

もちろん、システム(「PAUSE」)とは、OSシェルを作成し、「PAUSE」コマンドを実行させることを意味します。

実際にはは、セキュリティの問題ではないWindowsでのみ機能します。「PAUSE」は、外部プログラムを呼び出さないシェル内部コマンドであるためです(システムシェル自体がハッキングされている場合を除く)。しかし、別の問題があるよりも)

Windowsでは、大きな「パフォーマンスの問題」ではありません。CMD.EXEのイメージはほぼ確実にRAMにあり、CMDデータセグメントは非常に小さく、…まあ…一時停止を要求しています(できるだけ速く実行しないでください!)

システムウィンドウ以外これは機能しません(PAUSEコマンドがない可能性があります)セキュリティリークです(誰かca n PAUSEプログラムを作成して、自分のタスクではなく自分のタスクを実行します。

したがって、自分だけのマシンと自分だけのOSをターゲットにしない限り、移植性がなく、危険でさえある可能性があります。

しかし、問題は「代わりに何をすべきか」になります。

ほとんどの機能を確認するのは素晴らしいことです。答えは…間違っています。なぜなら…動作しないからです!

理由を見てみましょう:

プログラムcin -2つの整数、いくつかの結果を表示し、…待機または終了する必要がありますか?

仮定しましょう。待ちたい: cin >> acin >> bにどのように答えますか?

入力は次のようになります

12\n

34\n

これらのfを入力する必要があります。コンソール入力モードを終了する必要があるため、.ingが返されます。

これで、cin >> a は「12」を消費します。戻り値はバッファに残ります。

cin >> bは、最初の非スペースまで、すべての数字よりもすべてのスペース(戻り値を含む)を消費します。 「\ n34」を消費します(そしてb = 34に設定します)。

入力バッファに戻るまであります。では、すべてのエキスパートが FAIL!

  1. cin.get()をどのように使用するかを見てみましょう。 間違った:これは1文字を読み取り、続行します。また、入力バッファには1文字あるため、一時停止しません
  2. cin.ignore()間違った:まだバッファに戻ってきます。あなたはそれを無視します…そしてさらに進みます。 一時停止なし

では、どのように作成する必要がありますか?

この特定のサンプルでは、リターンまでのバッファ内にあるすべてのものを無視する必要があります。次に、無視するものを要求します。

cin.clear(); // clear an eventual "bad read" flag

cin.ignore(BIG\_NUMBER,’\n’); // ignore all remaining pending input

cin.get(); //just read one more!

BIG\_NUMBERは、…入力できる文字よりも大きいものですEnterキーを押す前のコンソール。

この番号を取得する標準的な方法は

numeric\_limits::max()

(don #include

つまり、最後には…

void pause()

{

cin.clear();

cin.ignore(numeric\_limits::max(),’\n’);

cin.get();

}

適切な一時停止機能になります。

しかし、今すぐ教えてください:

誰かが入力した場合はどうなりますか

12abcd\n

??

最初の読み取りでは「12」が表示され、2番目の読み取りでは「a…」が表示されて失敗します(数字ではありません!)。 Bはまったく読み取られません。

pause()よりも「不良ビット」がクリアされ、abcd\nが破棄されます。 「1」を読んで、問題なく終了します。

道徳的:数値を読み取るときは、読み取りが失敗しなかったことを常に確認し、最終的な不正な入力を破棄します。

while(!(cin >> b))

{ cin.clear(); cin.ignore(numeric\_limits::max(),’\n’); }

ただし、これには管理も必要ですプロンプトなどの数…そして実際の目的から離れすぎています。

回答

これはクリーンな解決策ではありません。 「ハック」と呼ぶ人もいれば、「回避策」と呼ぶ人もいます。

C言語の優れた特性の1つは、です。移植性。また、system(“ PAUSE”)構文では、プログラムの実行に使用しているコンソールに依存するため、この移植性が失われます。

では、代替手段は何ですか?悲しいことに、完全にクリーンなソリューションはありません。この構文を使用している人を見たことがあります

std::cout << “Press any key to continue…”;

std::cin >> Some\_variable\_you\_declared\_in\_advance;

基本的に、これは単なる別のハックであり、ストリームを使用してプログラムを一時停止します。しかし、この方法で移植性を失うことはありません。

私が知っている最もクリーンなソリューションの1つはこれです(ただし、味に大きく依存します):

void pause () {

std::cin.ignore();

}

このようにして、独自の一時停止機能を使用できます 。 それは基本的に1つの文字を読み取り、それを無視します。これはまさにあなたが達成したいことです。 しかし、私が言ったように、それは確かに最善の解決策ではなく、私の個人的なお気に入りです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です