C ++コンソールアプリケーションがすぐに終了しないようにする方法


193

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


5
実行可能ファイルをダブルクリックしていますか?Windowsで作業していますか?コマンドシェルから作業し、実行したいコマンドを入力しないのはなぜですか?
S.Lott、2015年

8
@S Lott:IDEで[移動]ボタンを押すと、コンソールに煩わされる必要がないためです。
ビリーONeal

4
C ++を学ぶための良い本を入手することを検討してください。Webサイトは優れたリソースですが、優れた紹介文には適していません。C ++の本の決定的なリストがここにあります: stackoverflow.com/questions/388242/...は
ジェームズMcNellis

6
@Billy終了時に[Go]ボタンを押してアプリを閉じると、間違ったIDEを使用しています。

2
以前の質問と回答:stackoverflow.com/questions/902261/…。ただし、こちらの方がタイトルが優れています。
dmckee ---元モデレーターの子猫2010

回答:


121

編集: Charles Baileyが以下のコメントで正しく指摘しているように、にバッファリングされている文字がある場合、これは機能せずstdin、それを回避するための良い方法は本当にありません。デバッガーを接続して実行している場合、John Diblingが提案する解決策は、おそらく問題に対する最もクリーンな解決策です。

とは言っても、これはここに残しておきます。他の誰かが役に立つと思うかもしれません。開発中にテストを作成するときに、一種の簡単なハックとして多く使用しました。


main関数の最後で、次を呼び出すことができますstd::getchar();

これはから1文字を取得するためstdin、「続行するには任意のキーを押してください」という種類の動作を提供します(実際に「任意のキーを押してください」というメッセージが必要な場合は、自分で印刷する必要があります)。

あなたはする必要が#include <cstdio>ためgetchar


15
getchar問題を解決しない-または少なくとも限られた状況でのみ。からcharを読み取りますが、stdinstdinからバッファリングされた文字がすでにある場合、プロンプトを出力するかどうかに関係なく、プログラムは待機せずに続行します。
CBベイリー

1
@チャールズ:良い点。untilを無視すること\nは部分的な解決策ですが、複数行の入力がバッファリングされている場合は役に立ちません。入力ストリームからすべてをクリアする標準C ++の方法を知りません。:-/
ジェームズマクネリス

1
@ジェームズ:古いですが、どうstd::cin.ignore(std::cin.rdbuf()->in_avail());ですか?ここからだ。
GManNickG

1
私がたくさん使用する1つのオプションはstd::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');#include <limits>です。
Xeo

5
これを行わないでください。:(それは、これを行うにはあなたのプログラムの機能の一部ではありません。
軌道上での明度レースは

138

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

CTRL-F5(デバッグなしで開始)を押すと、アプリケーションが起動し、任意のキーを押すまでコンソールウィンドウを開いたままにします。


1
IDEからコンソールを起動しますか?どのようにそしてなぜあなたはそれをしますか?
CodyBugstein 2013

1
すばらしい、うまくいきました。これがVisual Studioのデフォルトの動作ではないのはなぜですか?
ルミネア2017年

今日まで、簡単なコンソールプログラムを作成し、上記の方法が機能しなかったときまで、それがその方法だと思っていました:(
KansaiRobot

1
デバッグ付きのバージョンはありますか?
luckyging3r

109

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

またはWindowsmain関数から戻る直前に次のコードを追加することもできます。

  system("pause");

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


2
これは、ソリューションのRube Goldbergバリエーションのように聞こえます。
Dave Van den Eynde

4
@Dave Van den Eynde:これもかなり一般的で、DevCPPの定型コードに標準で付属しています。+1
ビリーオニール

4
一方、@ Daveは、これが単なる例にすぎないことを明らかにしています。一方、std:getchは、実際のコードに誤って残されている可能性があります。
Martin Beckett、

2
これは、Windowsの場合に完全に有効なソリューションです。理想的ではありませんが、機能します
thecoshman

最も簡単で迅速なソリューション。ちょうど私が必要としたもの
CodyBugstein

83

MicrosoftのVisual C ++ 2010 Expressを使用していて、プログラムが終了した後、CTRL + F5がコンソールを開いたままにできないという問題が発生した場合は、このMSDNスレッドをご覧ください。

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

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


1
コンソールアプリでない場合はどうなりますか?
Jesse Pepper

3
@ Mr.Underhillこれは、デバッガーなしで起動した場合にのみ機能します(Ctrl + F5)。
ジョナサンミー

唯一の非ハックソリューションであることは別にして、これはメインスタックオブジェクトデストラクタからのプリントを確認する唯一の方法でもあります。
Poniros

20

通常、main()の閉じ中かっこにブレークポイントを設定します。何らかの方法でプログラムの最後に到達すると、ブレークポイントがヒットし、ALTキーを押しながらコンソールウィンドウに移動して出力を表示できます。


14

Windowsを使用している場合は、プログラムをコンソールから実行するのではなく、cmd.exeからプログラムを実行するのはなぜですか。これにより、プログラムの終了後もウィンドウは開いたままになります。

[編集]:KDevelop4を使用すると、IDEの下部にあるタブでBash(Linux CLI)の完全なインスタンスが実行されています。これは、私がこのような状況で使用するものです。


3
IDEを使用している場合、通常はコンソールを使用しないからです。あなたが行くと、プログラムが実行され、それだけです。
ビリーONeal

3
アプリが終了しても、有能なIDEはコンソールを画面に表示し続けます-たとえば、Code :: Blocksはこれを正確に実行します。

3
@nobugz:わかった。ウィンドウを固定するには、リンカーのコマンドラインに/ SUBSYSTEM:CONSOLEが必要です。ドキュメントには、これがmain定義されている場合はこれがデフォルトであると記載されていますが、コマンドラインで明示的に設定しない場合、VSはアプリケーションの終了時にウィンドウを強制終了します。 ため息
ジェームズマクネリス

2
@James:そもそもコンソールウィンドウを取得するために必要です。そのため、WinMain()ではなくmain()が必要ですが、その逆は必要ありません。私は少し迷っています...
Hans Passant

4
@nobugz:「Win32コンソールアプリケーション」ではなく「空のプロジェクト」から開始する場合、サブシステムはプロジェクトプロパティで明示的に設定されていません。mainプロジェクトで定義すると、リンカーはデフォルトでCONSOLEサブシステムを使用します。デバッグまたは実行すると、コンソールウィンドウが表示されます。ただし、プロジェクトプロパティでサブシステムとしてCONSOLEを明示的に指定しない限り、Visual Studioはコンソールウィンドウを開いたままにしません。私はいつも空のプロジェクトから始めて、個々のプロジェクトのプロパティを変更することはめったにないので、コンソールウィンドウが動かなくなるのを見たことがありません。混乱して申し訳ありません
James McNellis

9

コードの終わりの前に、次の行を挿入します。

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
}

また、「続行するには任意のキーを押してください...」と印刷されていました。私のために。
PapaHotelPapa 2016年

8

cin.get();2回電話する:

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

6
しかし、なぜ二度?
Madhawa Priyashantha

この前に配列内の文字列などを取得するために別のcin.get()が必要な場合はどうなりますか?このシナリオでは機能しません。
QMaster 2015年

4

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


3

Visual Studioを使用してWindowsを使用していると思いますが、なぜですか?なんらかのLinux OSを使用している場合は、おそらくコンソールから実行しているからです。

とにかく、他の人が示唆しているように、あなたはあなたのプログラムの最後にがらくたを追加することができます、またはあなたは単にCTRL + F5を押すことができます(デバッグなしで開始)を、Visual Studioはコンソールを完了したままにしておきます。

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


3
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

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

    return 0;
}

他の誰かがこれを投稿していることに気づかなかったので、ここにあります。


これconio.hはWindows固有のヘッダーであり、すべてのマシンで利用できるとは限りません(または、個別にリンクする必要があるかもしれません。これはやり過ぎです)。
Yksisarvinen

ワーキング。getch()を変更する必要があるだけです。_getch(); 廃止されて以来
ncesar

2

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

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


2

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

cin.get();

2

いずれかの前に、以下の行を追加しますexit()機能、または任意の前returnでS main()

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

これは機能しません。最初の行は機能しますが、
Enterキーを

2

Visual Studio(およびVisual Studioのみ)の場合、次のコードスニペットは、最初に入力バッファーをフラッシュすることにより、ユーザーが新しいキーを明示的に押すのを本当に待つ「キープレスの続行を待機する」プロンプトを提供します。

#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 ++がそれらを呼び出すため)。


2

私はこれをします:

//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より優れていますが、少し冗長であり、通常は不要です。


動作しますが、0を返します。このコードを使用すると実行されません。
wernersbacher 2016年

2

以下のコードのように#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");
}

system<cstdlib>ではなくで宣言されていstdafx.hます。
メルポメン

1

イェ・アンサーと同様のアイデア、ミニマリストの代替案。

次の内容のバッチファイルを作成します。

helloworld.exe
pause

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


1

単に

#include <cstdio>

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

何らかの理由で、プログラムを実行するときに、通常stdinにあるgetcharを使用して1文字を読み取ることができます。したがって、最初のgetcharはこの文字を読み取り、2番目のgetcharはユーザー(ユーザー)の入力を待ってからプログラムを終了します。そして、プログラムがほとんどの端末を終了した後、特にWindowsでは、端末をすぐに閉じます。したがって、プログラムがすべてを出力した後にプログラムが終了しないようにする簡単な方法を目指しています。もちろん、これを解決するためのより複雑でクリーンな方法がありますが、これが最も簡単です。


2
これが問題を解決する理由の少なくとも短い説明を追加してください。
kaya3

0

IDEのプロジェクト設定にチェックボックスがあり、プログラムの終了後もウィンドウを開いたままにしているかどうかを確認します。そうでない場合は、std::cin.get();main関数の最後で文字を読み取るために使用します。ただし、必ず行ベースの入力(std :: getline)のみを使用するか、残りの未読文字を処理するようにしてください(std :: ignoreまでは改行まで)。以前に未読。


0

これはうまくいくようです:

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

最初にバッファをクリアすると、次のバッファを読み取るときに問題になりません。何らかの理由でcin.ignore(1)機能しない場合は、2にする必要があります。


1
2でも十分でない場合があります(キューに追加されたキーストロークがある場合)。正しい方法は、キューにあるのと同じ数の文字を無視することです。に、cin.rdbuf()->in_avail。1または2のようではない、いくつかのマジックナンバー
コンラートルドルフ

0

いつでもバッチファイルを作成できます。たとえば、プログラムの名前がhelloworld.exeの場合、コードは次のようになります。

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

0

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


0

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


1
これは質問に対する答えを提供しません。批評したり、著者に説明を要求したりするには、投稿の下にコメントを残します。自分の投稿にはいつでもコメントできます。十分な評判得られれ、どの投稿にもコメントできます。
Ravi Dhoriyaツデク14'14

1
これはどのように答えを提供しないのですか?私は質問の著者のようにまったく同じ状況にあり、これが役立ちます。
lierosk 14

0

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


0

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


0

実行ボタンを押す代わりに、CTRLとF5を同時に押すと、任意のキーを押してメッセージを続行できます。または、メイン関数の最後に「(警告は、実際のプログラムをテストするためだけに使用しないでください!!!)」と入力してください:(警告は、実際のプログラムをテストするためにのみ使用してください気に入らない!!!!)


0

0を返す直前にcin.ignore()を使用してください。二度

main()
  {
  //your codes 

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

  return 0;
  }

それで全部です


私は通常、このようなことをしています。cin.ignore(); cin.get();
aj.toulan


-1

main()関数の最初(たとえばint a;)で整数を宣言してstd::cin >> a;、戻り値の直前に置くこともできます。したがって、プログラムはキーを押して入力するまで実行を続けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.