最近、私はこのウェブサイトからC++を学ぼうとしています。残念ながら、コードサンプルの1つを実行しようとすると、そのプログラムが約0.5秒間開いてから、すぐに閉じます。私の努力の成果を見ることができるように、プログラムがすぐに終了するのを止める方法はありますか?
35 に答える
Visual Studioを使用していて、IDEからコンソールアプリケーションを起動している場合:
Ctrl -F5(デバッグなしで開始)を押すと、アプリケーションが起動し、いずれかのキーを押すまでコンソールウィンドウが開いたままになります。
編集: Charles Baileyが以下のコメントで正しく指摘しているように、にバッファリングされた文字がある場合、これは機能しません。これをstdin
回避する良い方法は実際にはありません。デバッガーを接続して実行している場合、John Diblingが提案する解決策は、おそらく問題に対する最もクリーンな解決策です。
そうは言っても、私はこれをここに残しておきます、そして多分他の誰かがそれが役に立つと思うでしょう。開発中にテストを作成するときのちょっとしたハックとして、これをよく使用しました。
関数の最後に、main
を呼び出すことができますstd::getchar();
これにより、から1文字が取得されるため、stdin
「続行するには任意のキーを押してください」というような動作が得られます(実際に「任意のキーを押してください」というメッセージが必要な場合は、自分で印刷する必要があります)。
あなたはのためにする必要があり#include <cstdio>
ますgetchar
。
Jamesによるソリューションは、すべてのプラットフォームで機能します。
または、関数Windows
から戻る直前に次を追加することもできます。main
system("pause");
これによりpause
、キーを押すまで待機し、素敵なメッセージを表示するコマンドが実行されますPress any key to continue . . .
Microsoft の Visual C++ 2010 Express を使用していて、プログラムの終了後にコンソールを開いたままにしておくためにCTRL+F5が機能しないという問題が発生した場合は、この MSDN スレッドを参照してください。
CTRL+F5 の実行後にコンソールを閉じるように IDE が設定されている可能性があります。実際、Visual C++ 2010 の「空のプロジェクト」はデフォルトでコンソールを閉じます。これを変更するには、Microsoft モデレーターの提案に従ってください。
プロジェクト名を右クリックして [プロパティ] ページに移動し、[構成プロパティ] -> [リンカー] -> [システム] を展開して、[サブシステム] ドロップダウンで [コンソール (/SUBSYSTEM:CONSOLE)] を選択してください。デフォルトでは、空のプロジェクトでは指定されていないためです。
main()
私は通常、中括弧を閉じるときにブレークポイントを設定します。プログラムの最後に到達すると、ブレークポイントがヒットし、Altキーを押しながらコンソールウィンドウに移動して出力を表示できます。
コンソールからプログラムを実行しないでください。つまり、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
}
Code::Blocksなどの有能な IDE からコードを実行する場合、IDE は、コードの実行に使用するコンソールを管理し、アプリケーションを閉じるときに開いたままにします。コンソールを開いたままにするための特別なコードを追加する必要はありません。これは、IDE の外部で実際に使用するときにコンソールが正しく機能しなくなるためです。
さて、あなたはVisual Studioを使用しているWindowsを使用していると思います...なぜですか?ある種のLinuxOSを使用している場合は、おそらくコンソールから実行しているからです。
とにかく、他の人が示唆しているように、プログラムの最後にがらくたを追加するか、CTRL + F5(デバッグなしで開始)を押すだけで、VisualStudioは完了するとコンソールを起動したままにします。
デバッグバージョンを実行し、コードにがらくたを追加したくない場合の別のオプションは、コンソールウィンドウを開き([スタート]->[実行]->[cmd])、デバッグ出力ディレクトリに移動することです。次に、実行可能ファイルの名前を入力するだけで、コンソールでデバッグプログラムが実行されます。その後、本当に必要な場合は、VisualStudioのアタッチを使用してプロセスなどを実行できます。
プログラムの最後に次を追加するだけです。何らかの形式のユーザー入力をキャプチャしようとするため、コンソールが自動的に閉じられなくなります。
cin.get();
Visual C ++で実際にアプリケーションをデバッグしている場合は、F5キーまたはツールバーの緑色の三角形を押します。実際にデバッグしていない場合(ブレークポイントが設定されていない場合)は、Ctrl + F5を押すか、メニューで[デバッグなしで開始]を選択します(通常は[デバッグ]メニューにありますが、混乱を招きます)。少し速くなりますが、さらに重要なのは、コードを変更せずに最後に一時停止することです。
または、コマンドプロンプトを開き、exeファイルが存在するフォルダーに移動し、名前を入力して実行します。そうすれば、実行が終了してもコマンドプロンプトは閉じず、出力を確認できます。私は、アプリが終了したときに停止するコードを追加するよりも、これらの方法の両方を好みます。
exit()
次の行を関数の前またはreturn
in の前に追加しますmain()
。
std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
単に
#include <cstdio>
int main(){
// code...
std::getchar();
std::getchar();
return 0;
}
なんらかの理由で、通常、プログラムを実行するときに getchar を使用して読み取ることができる文字は、すでに stdin に 1 つあります。したがって、最初の getchar はこの文字を読み取り、2 番目の getchar はユーザー (あなた) の入力を待ってからプログラムを終了します。そして、プログラムがほとんどの端末を終了した後、特に Windows では、すぐに端末を閉じます。したがって、私たちが目指しているのは、すべてを出力した後にプログラムが終了するのを防ぐ簡単な方法です。もちろん、これを解決するためのより複雑でクリーンな方法がありますが、これが最も簡単です。
以下のコードのように#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");
}
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++がそれらを呼び出すため)。
いつでもバッチファイルを作成できます。たとえば、プログラムが helloworld.exe という名前の場合、一部のコードは次のようになります。
@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
IDE のプロジェクト設定に、プログラムの終了後もウィンドウを開いたままにするチェックボックスがあるかどうかを確認してください。std::cin.get();
そうでない場合は、メイン関数の最後で文字を読み取るために使用します。ただし、行ベースの入力 (std::getline) のみを使用するか、それ以外の場合は残りの未読文字を処理するようにしてください (std::ignore until newline)。以前未読。
私は使用cin.get()
しましたが、それは機能しましたが、ある日、cin.get([Array Variable])
その前に別のものを使用して、途中に空白文字のあるリング文字列を取得する必要がありました。そのため、cin.get()
コマンドプロンプトウィンドウが閉じるのを避けませんでした。最後に、別の方法を見つけました。CTRL + F5を押して外部ウィンドウで開くと、Visual Studioはそれを制御できなくなります。最後のコマンドが実行された後、閉じることについて尋ねられます。
Windows を実行している場合は、system("pause >nul");
またはを実行できますsystem("pause");
。キーを押すまでプログラムを一時停止するコンソール コマンドを実行します。>nul
と言うのを防ぎますPress any key to continue...
。
これはうまくいくようです:
cin.clear();
cin.ignore(2);
最初にバッファーをクリアすると、次のバッファーを読み取るときに問題になりません。何らかの理由cin.ignore(1)
で機能しない場合は、2 にする必要があります。
x の変数を設定してから、これを return 0; の前に入力するだけです。
cout<<"\nPress any key and hit enter to end...";
cin>>x;
関数の先頭で整数を宣言してmain()
(たとえば) 、戻り値の直前にint a;
置くこともできます。std::cin >> a;
したがって、キーを押して入力するまで、プログラムは実行され続けます。
conio.h
コードの最後に と を含め、 の前にreturn 0
書き込みます_getch();
固執することもできます
while(true)
;
また
for(;;)
;
最後に。
これをコードの最後に置くだけです:
while(1){ }
この機能は永久に (またはコンソールを閉じるまで) 継続し、コンソールが勝手に閉じないようにします。