![](/img/trans.png)
[英]C++ console application window exiting too early, but not immediately (VS 2017)
[英]How to stop C++ console application from exiting immediately?
最近,我一直在嘗試從這個網站學習 C++。 不幸的是,每當我嘗試運行其中一個代碼示例時,我都會看到該程序打開了大約半秒鍾,然后立即關閉。 有沒有辦法阻止程序立即關閉,以便我可以看到我的努力成果?
如果您使用的是 Visual Studio 並且正在從 IDE 啟動控制台應用程序:
按CTRL-F5 (不調試啟動)將啟動應用程序並保持控制台窗口打開,直到您按任意鍵。
編輯:正如 Charles Bailey 在下面的評論中正確指出的那樣,如果在stdin
緩沖了字符,這將不起作用,並且確實沒有好的方法可以解決這個問題。 如果您使用附加的調試器運行, John Dibling 建議的解決方案可能是解決您問題的最干凈的解決方案。
也就是說,我會把它留在這里,也許其他人會發現它很有用。 在開發過程中編寫測試時,我經常使用它作為各種快速技巧。
在main
函數結束時,您可以調用std::getchar();
這將從stdin
獲得一個字符,從而為您提供“按任意鍵繼續”的行為(如果您確實想要“按任意鍵”消息,則必須自己打印一個)。
您需要為getchar
#include <cstdio>
。
James 的解決方案適用於所有平台。
或者,在Windows
您還可以在從main
函數返回之前添加以下內容:
system("pause");
這將運行pause
命令,它會一直等到您按下某個鍵並顯示一條不錯的消息Press any key to continue . . .
Press any key to continue . . .
如果您使用 Microsoft 的 Visual C++ 2010 Express 並遇到CTRL+F5在程序終止后無法保持控制台打開的問題,請查看此 MSDN 線程。
可能您的 IDE 設置為在 CTRL+F5 運行后關閉控制台; 事實上,Visual C++ 2010 中的“空項目”默認關閉控制台。 要更改此設置,請按照 Microsoft 版主的建議進行操作:
請右鍵單擊您的項目名稱並轉到“屬性”頁面,請展開配置屬性 -> 鏈接器 -> 系統,請在子系統下拉列表中選擇控制台 (/SUBSYSTEM:CONSOLE)。 因為,默認情況下,Empty 項目沒有指定它。
我通常只是在main()
的右花括號上放置一個斷點。 當通過任何方式到達程序末尾時,斷點將被擊中,您可以按 ALT-Tab 到控制台窗口查看輸出。
如果您使用的是 Windows,為什么不直接從控制台運行該程序,即從 cmd.exe 運行該程序。 這樣窗口在程序完成后保持打開狀態。
[編輯]:當我使用 KDevelop4 時,有一個完全成熟的 Bash 實例(一個 Linux CLI)在 IDE 底部的選項卡中運行。 這就是我在這種情況下使用的。
在代碼結束之前,插入以下行:
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(例如Code::Blocks )運行代碼,IDE 將管理它用來運行代碼的控制台,並在應用程序關閉時保持打開狀態。 您不想添加特殊代碼來保持控制台打開,因為當您在 IDE 之外實際使用它時,這將阻止它正常運行。
我只是這樣做:
//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 更好,但它有點羅嗦,通常是不必要的。
好吧,我猜你在使用 Visual Studio 的 Windows 上......為什么? 好吧,因為如果您使用的是某種 Linux 操作系統,那么您可能會從控制台運行它。
無論如何,您可以像其他人建議的那樣在程序末尾添加廢話,或者您只需按CTRL + F5 (無需調試即可啟動),Visual Studio 將在完成后離開控制台。
如果您想運行 Debug 版本而不在代碼中添加廢話,另一種選擇是打開控制台窗口(開始 -> 運行 -> cmd)並導航到您的Debug 輸出目錄。 然后,只需輸入可執行文件的名稱,它就會在控制台中運行您的調試程序。 然后,您可以使用 Visual Studio 的附加功能進行處理,或者如果您真的願意的話。
最近,我一直在嘗試從該網站學習C ++。 不幸的是,每當我嘗試運行其中一個代碼示例時,我都會看到該程序打開大約半秒鍾,然后立即關閉。 有沒有一種方法可以阻止程序立即關閉,以便我可以看到自己的努力成果?
如果您實際上是在 Visual C++ 中調試應用程序,請按 F5 或工具欄上的綠色三角形。 如果您沒有真正調試它(您沒有設置斷點),請按 Ctrl+F5 或在菜單上選擇 Start without Debugging(它通常在 Debug 菜單上,我同意這令人困惑。)它會快一點,對您來說更重要的是,將在最后暫停而無需更改代碼。
或者,打開命令提示符,導航到您的 exe 所在的文件夾,然后通過鍵入其名稱來運行它。 這樣,當它完成運行時,命令提示符不會關閉,您可以看到輸出。 我更喜歡這兩種方法,而不是添加在應用程序完成時停止應用程序的代碼。
在任何exit()
函數之前或main()
任何return
之前添加以下行:
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 讀取 1 個字符。 所以第一個 getchar 讀取這個字符,第二個 getchar 在退出程序之前等待用戶(您的)輸入。 在程序退出大多數終端后,尤其是在 Windows 上,立即關閉終端。 所以我們的目標是一種防止程序在輸出所有內容后完成的簡單方法。 當然還有更復雜、更干凈的方法來解決這個問題,但這是最簡單的。
對於 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++ 調用它們)。
使用#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");
}
只需在程序末尾添加以下內容即可。 它將嘗試捕獲某種形式的用戶輸入,從而阻止控制台自動關閉。
cin.get();
與yeh答案類似的想法,只是極簡主義的替代方案。
創建一個包含以下內容的批處理文件:
helloworld.exe
pause
然后使用批處理文件。
您始終可以只創建一個批處理文件。 例如,如果您的程序名為 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...
。
查看您的 IDE 在項目設置中是否有一個復選框,以在程序終止后保持窗口打開。 如果沒有,請使用std::cin.get();
在 main 函數的末尾讀取一個字符。 但是,請確保僅使用基於行的輸入 (std::getline) 或以其他方式處理剩余的未讀字符(std::ignore 直到換行),否則最后的 .get() 只會讀取您留下的垃圾之前未讀。
我在程序的最后一個 return 0 處放置了一個斷點。 它工作正常。
我使用了cin.get()
並且這是有效的,但有一天我需要使用另一個cin.get([Array Variable])
在此之前獲取一個中間有空白字符的 ling 字符串。 所以cin.get()
沒有避免命令提示符窗口關閉。 最后我找到了另一種方法:按CTRL+F5在外部窗口中打開,Visual Studio 不再對其進行控制。 只是會在最終命令運行后詢問您是否關閉。
我嘗試在最后放置一個getchar()
函數。 但它沒有用。 所以我所做的是一個接一個地添加兩個getchar()
函數。 我認為第一個getchar()
吸收了您在最后一次數據輸入后按下的Enter鍵。 所以嘗試添加兩個getchar()
函數而不是一個
不是按運行按鈕,而是同時按 CTRL 和 F5,它會給你按任意鍵繼續的消息。 或者在您的主要功能的末尾輸入“(警告僅用於測試非實際程序,因為防病毒軟件不喜歡它!!!!)”但是:(警告僅用於測試非實際程序,因為防病毒軟件不喜歡它不喜歡!!!!)
只需在返回 0 之前使用 cin.ignore() ; 兩次
main()
{
//your codes
cin.ignore();
cin.ignore();
return 0;
}
就這樣
你也可以嘗試這樣做
sleep (50000);
cout << "any text" << endl;
這將保存您的代碼 50000m,然后打印消息並關閉。 但請記住,它不會永遠暫停。
這里有一個問題,不是那么明顯。 不知何故,我在程序的最后一行添加了一個調試斷點。 }
不知道我是怎么做的,也許是一個錯誤的鼠標點擊而不同屏幕之間跳躍。 我在 VS Code 中工作。
當我去調試時,系統立即跳轉到那個斷點。 沒有錯誤消息,沒有臨時輸出,什么都沒有。 我想,程序是如何沖過我設置的所有斷點的? 這花了太長時間才弄明白。
顯然,系統將最后一行斷點視為“第一個”停止點。 簡單的修復? 刪除那個斷點,哦! (在此處插入額頭巴掌。)
這似乎運作良好:
cin.clear();
cin.ignore(2);
如果您先清除緩沖區,則在閱讀下一個緩沖區時不會有問題。 由於某種原因cin.ignore(1)
不起作用,它必須是 2。
您只需為 x 設置一個變量,然后在返回 0 之前輸入它即可;
cout<<"\nPress any key and hit enter to end...";
cin>>x;
您甚至可以在main()
函數的開頭聲明一個整數(例如int a;
),然后將std::cin >> a;
放進去std::cin >> a;
在返回值之前。 因此,該程序將一直運行,直到您按下一個鍵並輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.