C ++コンソールアプリケーションがすぐに終了するのを止める方法は?

StackOverflow https://stackoverflow.com/questions/2529617

質問

最近、私はc ++を学びようとしてきました このウェブサイト. 。残念ながら、コードサンプルの1つを実行しようとするたびに、そのプログラムが約30秒間開いてからすぐに閉じます。私の努力の成果を見ることができるように、プログラムがすぐに閉じるのを止める方法はありますか?

役に立ちましたか?

解決

編集: チャールズ・ベイリーが以下のコメントで正しく指摘しているように、バッファリングされた文字がある場合、これは機能しません stdin, 、そしてそれを回避する良い方法は本当にありません。デバッガーを添付して走っている場合は、 ジョン・ディブリングの提案された解決策 おそらくあなたの問題に対する最もきれいな解決策です。

そうは言っても、私はこれをここに残します、そして多分他の誰かがそれが役に立つと思うでしょう。開発中にテストを書くとき、私はそれを一種の迅速なハックとして多く使用しました。


あなたの終わりに main 機能、呼び出すことができます std::getchar();

これにより、1つの文字が取得されます stdin, したがって、「キーを押して続行する」ような動作を提供します(実際に「キーを押す」メッセージが必要な場合は、自分で印刷する必要があります)。

必要がある #include <cstdio> 為に getchar.

他のヒント

Visual Studioを使用していて、IDEからコンソールアプリケーションを開始している場合:

プレス Ctrl-F5 (デバッグなしで開始)アプリケーションを開始し、キーを押すまでコンソールウィンドウを開いたままにします。

Jamesによるソリューションは、すべてのプラットフォームで機能します。

またはその後 Windows から戻る直前に次のことを追加することもできます main 関数:

  system("pause");

これは実行されます pause キーを押すまで待っているコマンドと素敵なメッセージも表示されます Press any key to continue . . .

MicrosoftのVisualC ++ 2010 Expressを使用している場合、 Ctrl+F5 プログラムが終了した後、コンソールを開いたままにしておくために機能しません。 このMSDNスレッド.

おそらく、CTRL+F5の実行後、IDEがコンソールを閉じるように設定されている可能性があります。実際、Visual C ++ 2010の「空のプロジェクト」は、デフォルトでコンソールを閉じます。これを変更するには、Microsoft Moderatorが提案したようにしてください。

プロジェクト名を右クリックして[プロパティ]ページに移動してください。構成プロパティ - >リンカー - >システムを展開してください。サブシステムドロップダウンでコンソール(/サブシステム:コンソール)を選択してください。デフォルトでは、空のプロジェクトでは指定されていないためです。

私は通常、ブレークポイントをつけています main()縮れた巻き毛のブレース。プログラムの終了に到達すると、ブレークポイントがヒットすると、コンソールウィンドウにalt-tabを表示して出力を表示できます。

Windowsを使用している場合は、コンソールからプログラムを実行するだけで、CMD.Exeからプログラムを実行してください。そうすれば、プログラムが終了した後、ウィンドウは開いたままです。

編集]:kdevelop4を使用すると、IDEの下部にあるタブで実行されているBASH(Linux CLI)の完全に駆け込められたインスタンスがあります。これが私がこの種の状況で使用するものです。

コードが終了する前に、この行を挿入します。

system("pause");

これにより、キーにヒットするまでコンソールが保持されます。

#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
}

電話 cin.get(); 2回:

    //...
    cin.get();
    cin.get();
    return 0
}

有能なIDEからコードを実行した場合、 コード::ブロック, 、IDEは、コードを実行するために使用するコンソールを管理し、アプリケーションが閉じるときに開いたままにします。コンソールを開いたままにしておくために特別なコードを追加したくありません。これにより、IDE以外で実際に使用すると正しく機能することができます。

さて、私はあなたがVisual Studioを使用してWindowsにいると思います...なぜですか?何らかのLinux OSを使用している場合は、おそらくコンソールから実行している可能性があるからです。

とにかく、他の人が提案しているようにプログラムの最後にがらくたを追加するか、ちょうどヒットすることができます Ctrl + F5 (デバッグせずに開始)とVisual Studioは、完了したらコンソールを放置します。

デバッグバージョンを実行し、コードにがらくたを追加しない場合の別のオプションは、コンソールウィンドウを開くこと(開始 - >実行 - > cmd)を開き、 デバッグ出力ディレクトリ. 。次に、実行可能ファイルの名前を入力するだけで、コンソールでデバッグプログラムを実行します。その後、Visual Studioのアタッチを使用してプロセスなどを使用できます。

実際にVisual C ++でアプリケーションをデバッグしている場合は、F5またはツールバーのグリーントライアングルを押します。実際にデバッグしていない場合(ブレークポイントが設定されていません)、CTRL+F5を押すか、メニューでデバッグせずに開始を選択します(通常はデバッグメニューにあります。これは混乱していることに同意します)。さらに重要なことに、コードを変更する必要なく、最後に一時停止します。

または、コマンドプロンプトを開き、exeがあるフォルダーに移動し、名前を入力して実行します。そうすれば、コマンドプロンプトの実行が終了したときに閉じず、出力を確認できます。私はこれらの両方の方法を、アプリが完成したとおりにアプリを停止するコードを追加することを好みます。

プログラムの最後に以下を追加するだけです。何らかの形のユーザー入力をキャプチャしようとするため、コンソールが自動的に閉じるのを止めます。

cin.get();

以前に次の行を追加します exit() 機能または任意の前 returns in main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");

Visual Studio(およびVisual Studioのみ)の場合、次のコードスニペットでは、ユーザーがプレスをするのを本当に待つプロンプトを「Keypressが続行するのを待ちます」 新着 明示的に、最初に入力バッファーをフラッシングすることにより:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

これはを使用していることに注意してください tchar.h マクロは、複数の「文字セット」と互換性があります(VC ++が呼び出すように)。

私はこれをします:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

注:CINバッファーなどをクリアすることは、プログラムの早い時点でCINを使用した場合にのみ必要です。また、std :: numeric_limits :: max()を使用することは、おそらくint_maxよりも優れていますが、少し言葉があり、通常は不要です。

使用する #include "stdafx.h" & system("pause"); 下のコードのように。

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    std::cout << "hello programmer!\n\nEnter 2 numbers: ";
    int x, y;
    std::cin >> x >> y;
    int w = x*y;
    std::cout <<"\nyour answer is: "<< w << endl;
    system("pause");
}
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

私はこれを投稿している人に気づかなかったので、ここにあります。

同様のアイデア ええ 答え、ただミニマリストの代替案。

次のコンテンツでバッチファイルを作成します。

helloworld.exe
pause

次に、バッチファイルを使用します。

IDEがプロジェクト設定のチェックボックスを持っているかどうかを確認して、プログラムが終了した後にウィンドウを開いたままにしておきます。そうでない場合は、使用してください std::cin.get(); メイン関数の最後にある文字を読む。ただし、ラインベースの入力のみ(std :: getline)のみを使用するか、それ以外の場合は残りの未読文字(std :: newlineまで無視する)に対処してください。先ほど読みません。

これはうまく機能しているようです:

cin.clear();
cin.ignore(2);

最初にバッファをクリアした場合、次のバッファを読んだときに問題はありません。何らかの理由で cin.ignore(1) 動作しません、2でなければなりません。

いつでもバッチファイルを作成できます。たとえば、プログラムがHelloWorld.exeと呼ばれている場合、一部のコードは次のとおりです。

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1

Windowsを実行している場合は、できます system("pause >nul"); また system("pause");. 。キーを押すまでプログラムを一時停止するコンソールコマンドを実行します。 >nul それが言うのを防ぎます Press any key to continue....

プログラムの最後の返品0にブレークポイントを置いています。正常に動作します。

単に

int main(){
    // code...
    getchar();
    getchar();
    return 0;
}

使った cin.get() そしてそれはうまくいきましたが、いつか私は別の日を使う必要がありました cin.get([Array Variable]) その前に、真ん中に空白の文字でリン文字列をつかむ。だから cin.get() コマンドプロンプトウィンドウを閉じるのを避けませんでした。最後に別の方法を見つけました:押します Ctrl+F5 外部ウィンドウとVisual Studioを開くことは、それを制御できなくなりました。最終的なコマンドが実行された後、閉鎖について尋ねます。

私はaを置いてみました getchar() 最後に機能します。しかし、それはうまくいきませんでした。だから私がしたことは2つを追加することでした getchar() 次々に機能します。私は最初だと思います getchar() 吸収します 入る キー最後のデータ入力の後に押します。 2つを追加してみてください getchar() 1つではなく関数

実行ボタンを押す代わりに、CTRLとF5を同時に押すと、メッセージを続行するキーをプレスに提供します。またはタイプ "(警告は、実際のプログラムをテストするためにのみ使用しないでのみ使用しないようにしています!!!!)」 'Tが好きです!!!!)

return 0の直前にcin.ignore()を使用するだけです。 2回

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

それで全部です

xの変数を設定する必要があるのは、return 0の前にこれを入力するだけです。

cout<<"\nPress any key and hit enter to end...";
cin>>x;

あなたはあなたの始まりに整数を宣言することさえできます main() 関数(たとえば int a;) そして、置きます std::cin >> a; 返品値の直前。そのため、キーを押して入力するまでプログラムは実行され続けます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top