62

私が C++ で最初に学んだことの 1 つは、

#include <iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

一時停止することなく、非常に速く現れたり消えたりします。これを防ぐには、メモ帳に移動して保存する必要がありました

helloworld.exe
pause

helloworld.bat

たくさんの小さなテスト プログラムを作成する必要があるとき、これは面倒でした。最終的にはwhile(true);、ほとんどのテスト プログラムの最後に、結果を確認できるようにするだけで済みました。私が使用できるより良い待機機能はありますか?

4

14 に答える 14

75

プログラムを閉じる前にユーザーにEnterキーを押すように要求できます...このようなものが機能します。

#include <iostream>
int main()
{
  std::cout << "Hello, World\n";
  std::cin.ignore();
  return 0;
}

cin はユーザー入力を読み取り、cin の .ignore() 関数はプログラムに入力を無視するように指示します。ユーザーがEnterキーを押すと、プログラムは続行します。

リンク

于 2009-05-23T19:27:45.040 に答える
55

多くの人が POSIX sleep、 Windows Sleep、 Windows system("pause")、 C++を提案してきました…およそ 1920 年代後半から、そこにcin.get()は DOS さえあり ます。getch()

これらのいずれも行わないでください

これらのソリューションはどれも、私のチームのコード レビューに合格しませんでした。つまり、このコードを製品に含めるために送信した場合、コミットはブロックされ、別の解決策を見つけるように言われます. (趣味で遊んでいるだけなら、物事はそれほど深刻ではないと主張する人もいるかもしれませんが、お気に入りのプロジェクトで良い習慣を身につけることが、ビジネス組織で価値のある専門家になり、雇用を維持できると私は提案します. )

プログラムの出力を読めるようにコンソール ウィンドウを開いたままにしておくことは、プログラムの責任ではありません。プログラムの最後に待機/スリープ/ブロックを追加すると、単一責任の原則に違反し、大規模な抽象化リークが発生し、プログラムの再利用性/連鎖性が失われます。一時的な使用上の理由でブロックされます。これは非常に良くありません。

代わりに、プログラムが作業を終了した後もプロンプトを開いたままにするように環境を構成する必要があります。あなたのバッチスクリプトラッパーは良いアプローチです! 手動で更新し続けなければならず、IDE から呼び出すことができないのがいかに面倒かがわかります。スクリプトがプログラムへのパスをパラメーターとして実行するようにし、プログラムを直接呼び出す代わりに IDE を構成することができます。

暫定的なクイック スタート アプローチは、IDE の実行コマンドcmd.exe <myprogram>またはから に変更する<myprogram>ことcmd.exe /K <myprogram>です。への/Kスイッチcmd.exe は、指定されたパスのプログラムが終了した後もプロンプトを開いたままにします。これは、バッチ スクリプト ソリューションよりも少し面倒exitです。プログラムの出力を読み終わったら、スペース バーを叩くだけでなく、赤い 'X' を入力またはクリックする必要があるからです。


IDE の使用を想定しています。それ以外の場合は、既にコマンド プロンプトから呼び出しているためです。これはそもそも問題にはなりません。さらに、Windows の使用を想定していますが (質問に記載されている詳細に基づいて)、この回答はどのプラットフォームにも当てはまります。

于 2016-04-02T14:37:24.383 に答える
24

テキストを表示するためのウィンドウの表示と非表示は、C++ の機能ではなく、プログラムの実行方法の機能です。

永続的なコマンドライン環境で実行するか、プログラムにウィンドウサポートsleep含めるか、他の回答に示されているように入力を使用または待機します。

于 2009-05-23T20:35:24.263 に答える
13

バッチプログラムに相当するものは次のようになります

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    std::cin.get();
    return 0;
}

追加の行はまさに何をするかPAUSE、単一の文字入力を待ちます

于 2009-05-23T19:27:49.627 に答える
7

実際、他の回答とは対照的に、OPのソリューションが最もエレガントなものだと思います。

外部.batラッパーを使用することで得られるものは次のとおりです。

  1. アプリケーションは明らかにユーザーの入力を待っているので、すでに必要なことを実行しています。
  2. ぎこちない呼び出しでコードが乱雑になることはありません。誰が待つべきですか?main()?
  3. クロス プラットフォームの問題に対処する必要はありませんsystem("pause")。ここで何人が提案したかを確認してください。
  4. これがなければ、ブラック ボックス テスト モデルで実行可能ファイルを自動的にテストするには、enterキープレスをシミュレートする必要があります (脚注に記載されていることを実行しない限り)。
  5. おそらく最も重要なことは、ユーザーが端末 ( cmd.exeWindows プラットフォーム) を介してアプリケーションを実行したい場合、とにかく出力が表示されるため、待機したくないということです。.batラッパー手法を使用すると、(または) ラッパーを実行するか、実行可能ファイルを直接実行するかを決定でき.batます.sh

最後の 2 つのポイントに焦点を当てる - 他の手法では、プログラムが少なくとも--no-waitスイッチを提供することを期待します。これにより、ユーザーとして、出力をパイプしたり、他のものとチェーンしたりするなど、あらゆる種類の操作でアプリケーションを使用できます。プログラムなど。これらは通常の CLI ワークフローの一部であり、既に端末内にいるときに最後に待機を追加すると、邪魔になり、ユーザー エクスペリエンスが破壊されます。

これらの理由から、.batここでは IMO ソリューションが最適です。

于 2015-10-17T11:14:30.373 に答える
4

あなたが持っているものは簡単に書くことができます。それ以外の:

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

書きます

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    system("PAUSE");
    return 0;
}

システム関数は、コマンド プロンプトで記述されたかのように、指定されたものを実行します。コマンドの実行中はプログラムの実行を一時停止するため、コマンドで何でもできます。cpp プログラムからプログラムをコンパイルすることもできます。

于 2009-05-24T02:04:19.500 に答える
2

構文:

void sleep(符号なし秒);

sleep() は、一定時間 (秒) 実行を中断します。sleep を呼び出すと、引数 seconds で指定された秒数の間、現在のプログラムの実行が中断されます。間隔は、最も近い 100 分の 1 秒またはオペレーティング システム クロックの精度のいずれか低い方まで正確です。

この例はそれを明確にするはずです:

#include <dos.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   printf("Message 1\n");
   sleep(2); //Parameter in sleep is in seconds
   printf("Message 2 a two seconds after Message 1");
   return 0;
}

dos.h を #include する必要があることを忘れないでください

編集:

winAPI を使用することもできます。

VOID WINAPI Sleep(
DWORD dwMilliseconds
);

スリープ機能(Windows)

winapi が提供する関数のパラメーターはミリ秒単位であるため、上記のコード スニペットのスリープ行は、「Sleep(2000);」のようになります。

于 2009-05-23T19:28:09.610 に答える
-1

getchar() は単純な答えを提供します (キーボード入力を待ちます)。終了する前にスリープするには、Sleep(milliseconds) を呼び出します。 スリープ機能 (MSDN)

于 2009-05-23T19:28:51.060 に答える
-2

mainのreturnステートメントの前に、次のコードを挿入します。

system( "一時停止");

これにより、キーを押すまでコンソールが保持されます。

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause");
    return 0; // this return statement isn't necessary
}
于 2013-02-10T09:03:30.607 に答える
-2

sleep() または usleep() を使用できます。

// Wait 5 seconds
sleep( 5 );
于 2009-05-23T19:27:11.140 に答える
-2

ええと、これは古い投稿ですが、私は質問に貢献するだけです-誰かが後で役に立つと思うかもしれません:

「cin.get();」を追加 main() の戻りの直前の関数は、結果を出力する前にプログラムが終了するのを常に停止しているようです: 以下のサンプルコードを参照してください:

int main(){ 文字列 fname, lname;

  //ask user to enter name first and last name
  cout << "Please enter your first name: ";
  cin >> fname;

  cout << "Please enter your last name: ";
  cin >> lname;     
  cout << "\n\n\n\nyour first name is: " << fname << "\nyour last name is: " 
  << lname <<endl;

  //stop program from exiting before printing results on the screen
  cin.get();
  return 0;

}

于 2011-01-09T17:53:04.910 に答える
-3

2 番目に学ばなければならないこと (これが最初であるべきだと主張する人もいるでしょう) は、OS のコマンド ライン インターフェイスと、コンパイラ/リンカーのフラグとスイッチです。

于 2009-05-23T19:47:00.227 に答える