簡體   English   中英

如何阻止 C++ 控制台應用程序立即退出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM