Visual C ++でコンソールウィンドウを開いたままにする方法は?


191

Visual C ++で始めていますが、コンソールウィンドウを保持する方法を知りたいのですが。

たとえば、これは典型的な「Hello World」アプリケーションです。

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

行方不明のものは何ですか?


Amruth A. Pillaiさんのおかげで、「継続するために、任意のキーを押して」表示されませんあなたのコード

単純なstd :: cout呼び出しで自分で印刷できます。
ラウル・ロア

5
すべての提案されたソリューションの欠点は、それらがデバッグで機能せず(Ctrl + F5がここで失敗する)、アプリケーションが予期せず停止した場合(メインリターンでのすべてのブレークポイントまたはstdinからの読み取りがここで失敗する)です。私が見たいのは、Eclipseや他のIDEのようなIDEコンソールウィンドウです。それらは単に、プログラムが終了した後もstdout / stderrへの出力を表示し続けます。
dr。シブレン2013

@sybren承認された回答はCTRL + F5で機能しますが、デバッグ(F5)で機能するソリューションが必要なのはなぜですか?確かにデバッグの全体のポイントは..デバッグですか?デバッグセッションで、プログラムの終了後にコンソールを一時停止する利点は何ですか?
JBentley 2014

2
@JBentley Eclipseおよびその他のIDEを使用すると、プロセスが終了した後でもプログラムの出力を読み取ることができます。確かに、特にバグを見つけようとすると、追加の利点がわかりますか?また、ブレークポイントは、プログラムが終了する場所がわかっている場合にのみ機能します。これは、出力が画面から消えたときにわかりにくい場合があります。
dr。シブレン14

回答:


389

Ctrl+F5だけではなく、プロジェクトを開始しF5ます。

Press any key to continue . . .プログラムが終了しても、コンソールウィンドウは開いたままで、メッセージが表示されます。

これには、Console (/SUBSYSTEM:CONSOLE)次のように有効にすることができるリンカーオプションが必要です。

  1. プロジェクトを開き、ソリューションエクスプローラーに移動します。K&Rで私と一緒にフォローしている場合、「ソリューション」は「hello」で、その下に1つのプロジェクトがあり、「hello」も太字で表示されます。
  2. 「hello」(またはプロジェクト名が何であれ)を右クリックします。
  3. コンテキストメニューから[プロパティ]を選択します。
  4. 「構成プロパティ」>「リンカー」>「システム」を選択します。
  5. 右側のペインの「サブシステム」プロパティについては、右側の列のドロップダウンボックスをクリックします。
  6. 「コンソール(/ SUBSYSTEM:CONSOLE)」を選択します
  7. [適用]をクリックし、処理が完了するまで待ってから、[OK]をクリックします。([適用]がグレー表示されている場合は、他のサブシステムオプションを選択し、[適用]をクリックして、戻ってコンソールオプションを適用します。私の経験では、それ自体では機能しません。)

CTRL-F5とサブシステムのヒントは一緒に機能します。これらは別個のオプションではありません。

http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6からのDJMorreTXの礼儀)


36
これにより、デバッグなしでプログラムが実行されます。デバッグモードと通常の実行モードの両方で機能するソリューションを用意することをお勧めします。
スーパーファミコン

3
このソリューションをメイクファイルプロジェクトで機能させることができない人にとっては、これはVisual Studioのバグが原因です。修正を含む回答を投稿しました。
JBentley 2014

1
確認できます!動作しないコンソールアプリがこれを実行した場合、動作しました。コードcin.get(),getchar(), system("pause")やその他のゴミを変更する必要はありません。これを変更すると動作します。
Callat

Ctrl + F5は「デバッグなしで開始」を意味します。したがって、デバッグ時にこれを使用することはできません。system("pause");コードの最後に追加するだけです。それは理にかなっており、正常に動作します。
Milad、2018年

41

標準的な方法はcin.get()、returnステートメントの前です。

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

4
プログラムがすでにcoutを使用しているので、処理済みであることはわかっていますが、#include <iostream>とstd名前空間の使用が必要になることを言及する価値があると思います:std :: cin.get() 。
ブライアン

7
この作品が、Ctrlキー+ F5がはるかに良いなど、グローバルオブジェクトの破壊をトレースする場合は特にです
三元

8
-1 _tmaincin.get()F5にブレークポイントを配置するか、Ctrl F5を使用する代わりに、別の-1に投票します。しかし、私は1つの反対投票のみ許可されています。
乾杯とhth。-Alf、

8
@乾杯:何が悪いの_tmain?これは、コンソールサブシステムをターゲットとするWindowsアプリケーションを作成する標準的な方法です。その標準から逸脱することは悪い習慣になるでしょう。明らかに、ここでは移植可能なコードについて誰も話していません。質問はVisual C ++であり_tmain、サンプルコードに表示される署名です。この宗教を放棄する時がきました。Windowsはデフォルトで「非標準」であり、その標準に従うことには十分な理由があります。
コーディグレイ

8
@CodyGray:私の反対票_tmainは、それが完全に不要な非標準であること(国際的なC ++標準にはプレーンが必要main)であること、およびMicrosoftのTマクロスキームを使用していることです。標準から逸脱することが悪い習慣であると感じる場合は、絶対にを使用しないでくださいtmaintmainトローリングを除いて、または専門家の場合、自分の完全な無能を表示することを除いて、を使用する正当な理由はありません。
乾杯とhth。-Alf

24

return行にブレークポイントを置きます。

デバッガで実行していますよね?


15
プログラム内に複数の出口がある可能性があるため、ほとんどの場合困難
volzotan '23

DLLがないためにプログラムが起動せず、そのブレークポイントに
Michael

17

別のオプションは使用することです

#include <process.h>
system("pause");

これはWindowsでのみ機能するため、移植性は高くありませんが、自動的に印刷されます。

何かキーを押すと続行します...


1
system( "pause")プロセッサーを実行し続けるため、使用しないでください。cin.get()または同等のものを使用します。
Krythic 2017

systemで宣言されてい<stdlib.h>ます。
メルポメン

@Krythic試してみたところ、CPUが100%消費されませんでした。私のプロセッサー使用率は、常に0%から1%でした。再現できません。
メルポメン

system( "pause")はcmdの "pause"コマンドを呼び出しますが、CPUを常に使用するわけではありません。本質的には_getche()と同等です。
Paul Stelian

7

メイクファイルプロジェクトの場合、Visual Studioのバグが原因で、承認されたソリューションは失敗します(少なくともバージョン2012までは存在します-2013はまだテストしていません)。このバグの詳細はこちらです。

makefileプロジェクトでプログラムの終了後にコンソールを一時停止するには、次の手順を実行します(これは2010〜2012以外のバージョンでは異なる場合があります)。

1)/SUBSYSTEM:CONSOLEリンカーに渡します。- 編集:以下を参照してください。

2)テキストエディターでプロジェクトファイル(.vcxproj)を開きます。

3)ルート<project>タグ内に、以下を挿入します:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4)ソリューションにプロジェクトを再ロードします。

5)デバッグせずにプログラムを実行します(CTRL + F5)。

編集:

以下の私のコメントのとおり、リンカオプションの設定は/SUBSYSTEM:CONSOLEメイクファイルプロジェクトには実際には関係ありません(MSVC以外のコンパイラを使用している場合は、必ずしも可能ではありません)。重要なのは、上記のステップ3のように、設定が.vcxprojファイルに追加されることです。


そのステップ3については聞いたことがありません。あなたはそれが必要で機能していることを確信していますか?
Mooing Duck 2014

@mooingduckはい、そしてここあなたの答えに対する私のコメントの後にでの/SUBSYSTEM:CONSOLEリンカーに渡すことが実際には無関係であることを発見しました-ステップ3がすべての問題です。私の答えはメイクファイルプロジェクトに関連していることに注意してください-メイクファイルプロジェクトでは、IDEはリンカーに渡すものを知る方法がありません(/SUBSYSTEM:CONSOLEオプションのあるコンパイラを使用していない可能性もあります)。これはプロジェクトです。それ自体がコンソールプログラムであるかどうかを追跡するそれ自体。私はそれに応じて私の答えを編集します。
JBentley 2014年

1
@mooingduckまた、ビルドシステムとしてSConsを使用し、コンパイラとしてMSVCおよびMinGWを使用して、メイクファイルプロジェクトでこのソリューションを自分で使用していることも確認できます。非デバッグモードでの終了後にIDEにコンソールを一時停止させる方法は他にありません。
JBentley

1
@chuckleplant恐れ入りますが、私のワークフローはその逆で、VSからSConsを呼び出していました。最初に手動でVS makefileプロジェクトを作成し、構成変数をSConsスクリプト(32/64ビット、コンパイラー名、リリース/デバッグなど)に渡し、残りのロジックを処理しました。そのセットアップでは、プロジェクトファイルを変更する必要はなかったので、SConsの自動生成機能は使用しませんでした。その後Linuxに切り替えたので、VSを使用しなくなりました。これはVSのバグであるため、必要な追加の手順を処理するためにSConsに機能リクエストを送信する価値があるかもしれません。
JBentley、2015

1
または、SConsスクリプトにいくつかのPythonコードを含めるだけで、プロジェクトファイルが生成されるたびに自分で行うことができます。VSプロジェクトファイルはXML標準に準拠していると思います。欠けている要素を簡単に追加でき、数行のコードしか必要ないはずです。ここ(Python 2.xの場合)またはここ(3.x)から始めることをお勧めしますこの答えも興味深いかもしれません。
JBentley、2015

4

コンソールウィンドウが閉じないようにするために、returnステートメントの直前cin.get();またはcin.ignore();直前を使用できます。


4

mainの最後の中括弧にブレークポイントを置くだけです。

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

私にとってはうまくいきます。デバッグなしで実行する必要はありません。また、ブレークポイントに到達する前にデストラクタを実行するため、これらのデストラクタに出力されているメッセージがあれば、それを確認できます。


3

_tmainメソッドの閉じ括弧にブレークポイントを追加するだけです。これはより簡単な方法であり、デバッグのためにコードを追加する必要もありません。


2

の終了中括弧にブレークポイントを配置しますmain()。複数のreturnステートメントを使用してもトリップします。唯一の欠点は、exit()がキャッチされないことです。

デバッグを行わない場合は、Zoidbergの回答にあるアドバイスに従い、単にの代わりにCtrl+でプログラムを開始してください。F5F5


2

私の2セント:

選択肢1:末尾にブレークポイントを追加する main()

選択2:このコードを、直前に追加しますreturn 0;

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

あなたは含める必要が<iomanip>ためstd::numeric_limits


2

このように0を返す前にコードの最後にsystem( "pause")を追加するだけです

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}



1

含めて、行の直前に#include <conio.h>追加します。それはとにかく私が学校で学んだことです。上記の方法は、私が見ているものとはかなり異なります。getch();return 0;


2
-1:プログラム自体を一時停止することは通常間違った解決策であるという事実は別として(ほとんどの場合、リリースされたバイナリに望まれる動作ではないため)、conio.hは非標準で古く、 C ++ではなくCヘッダー!残念ながら、学校では多くの不適切なプログラミング方法が教えられています。
JBentley 2014年

これはテスト中にのみ使用されることを期待しています。これは最終バージョンで保持するものではありません。Windows用にコーディングしている場合、#include <conio.h> / _getch();の問題は何ですか?cin.get()よりも書き方が速く、2つのキー(少なくとも1つの文字とEnterキー)を押す必要がなく、デバッグまたはリリースモードでのみ機能しません。それで何が悪いの?
Barnack

1

同じ問題があった。_getch()return文の直前を使ってい ます。できます。


特にずっと前に質問/回答された質問の場合は、コードに例と説明を追加することができます。さらに、あなたの答えは、いくつかの古い答えと機能的に同一であり、別の既存の答えと同じ通話を使用します。
時計じかけのミューズ

0

(一部のオプションは別の名前で呼び出される場合があります。英語版は使用しません)

同じ問題がありましたが、「空のプロジェクト」オプションでプロジェクトを作成すると、「空のプロジェクト」ではなく「Win32コンソールアプリケーション」としてプロジェクトを作成しました。今ポップアップするダイアログで、「続行」を押し、その後、「空のプロジェクト」オプションをチェックして確認を押します。その後、CTRL + F5は自動的に閉じないコンソールを開きます。


0

私も同じ問題を抱えていました。私のアプリケーションには複数のexit()ポイントがあり、正確にそれがどこにあるかを知る方法がなかったので、私はこれについて知りました:

atexit(system("pause"));

または

atexit(cin.get());

このようにして、プログラムのどこで終了しても停止します。


これらはどれもへの有効な呼び出しではありませんatexitatexit整数ではなく関数ポインタを取ります。
メルポメン

0

別のオプション:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

主に:

int main(int argc, char* argv[]) {
    MAINRET;
}

0

実際、実際の解決策は、プロジェクトテンプレート自体の選択です。古いVSでWin32コンソールアプリケーションを選択するか、最初にプロジェクト名を入力してから、Windowsデスクトップウィザードをダブルクリックして、Win32コンソールアプリケーションを選択する必要があります。次に、この時点で空のプロジェクトを選択します。これにより、追加のストップポイントとホールドコードを追加することなく、元の質問者が本当に望んでいたことが可能になります。私もこの問題を経験しました。答えはMSDNサイトにもあります。


0

以下は、コードを変更せずに実行が停止した方法に関係なく、コマンドウィンドウを開いたままにする方法です。

Visual Studioで、[ プロジェクトプロパティページ] -> [ デバッグ]を開きます。ます。

以下のためのコマンド、入力します。$(ComSpec)

以下のためにコマンド引数、入力します/k $(TargetPath)。独自のアプリケーションに引数を追加します。

これで、F5またはCtrl-F5は新しいウィンドウでWindows / System32 / cmd.exeを実行し、/ kは実行の完了後もコマンドプロンプトを開いたままにします。

欠点は、実行がブレークポイントで停止しないことです。


0

一部の人がすでに指摘したように、Zoidbergsソリューションはデバッガーをアタッチしません。これは通常は必要ありません。

最適なオプションは、[ツール]> [オプション]> [デバッグ]> [全般]に移動して、それに応じて(VS 2017以降)VSを構成することです。そこで、「デバッグが停止したときにコンソールを自動的に閉じる」(一番下)をオフにします。


-1

あなたは単にkeep_window_open(); 戻る前にここに一例があります

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

2
keep_window_open()はどこから来たのですか、例えばどのヘッダーファイルとライブラリですか?
トムグッドフェロー2017年

この1つのstd_lib_facilities.hからのものですが、ほとんどの場合、それが含まれています
Sifis Babionitakis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.