提问人:Adam P 提问时间:3/27/2010 最后编辑:Peter MortensenAdam P 更新时间:10/16/2023 访问量:596688
如何阻止 C++ 控制台应用程序立即退出?
How to stop C++ console application from exiting immediately?
问:
最近,我一直在尝试从这个网站学习C++。不幸的是,每当我尝试运行其中一个代码示例时,我都会看到该程序打开大约半秒钟,然后立即关闭。有没有办法阻止程序立即关闭,以便我可以看到我努力的成果?
答:
编辑:正如查尔斯·贝利(Charles Bailey)在下面的评论中正确指出的那样,如果其中有字符缓冲,这将不起作用,并且实际上没有很好的方法可以解决这个问题。如果在连接调试器的情况下运行,则 John Dibling 建议的解决方案可能是解决问题的最干净的解决方案。stdin
也就是说,我会把它留在这里,也许其他人会发现它有用。在开发过程中编写测试时,我经常使用它作为各种快速技巧。
在函数结束时,您可以调用 std::getchar();
main
这将从 中获取一个字符,从而为您提供“按任意键继续”类型的行为(如果您真的想要“按任意键”消息,则必须自己打印一个)。stdin
您需要 .#include <cstdio>
getchar
评论
getchar
不能解决问题 - 或者至少仅在有限的情况下。它从 读取一个字符,但是如果已经有从 stdin 缓冲的字符,则无论您是否打印提示,程序都将继续运行,而无需等待。stdin
\n
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
#include <limits>
James的解决方案适用于所有平台。
或者,您也可以在从函数返回之前添加以下内容:Windows
main
system("pause");
这将运行命令,该命令会等待您按下一个键,并显示一条不错的消息pause
Press any key to continue . . .
评论
为什么不从控制台运行程序,即如果您使用的是 Windows,则从 cmd.exe 运行程序。这样,窗口在程序完成后将保持打开状态。
[编辑]:当我使用 KDevelop4 时,在 IDE 底部的选项卡中运行了一个成熟的 Bash(Linux CLI)实例。这就是我在这种情况下使用的。
评论
main
main
查看 IDE 在项目设置中是否有一个复选框,以便在程序终止后使窗口保持打开状态。如果没有,则用于读取 main 函数末尾的字符。但是,请确保仅使用基于行的输入 (std::getline) 或处理剩余的未读字符 (std::ignore 直到换行符),否则末尾的 .get() 将只读取您之前未读的垃圾。std::cin.get();
如果从合格的 IDE(如 Code::Blocks)运行代码,则 IDE 将管理用于运行代码的控制台,并在应用程序关闭时保持打开状态。您不希望添加特殊代码来使控制台保持打开状态,因为当您在 IDE 之外实际使用它时,这会阻止它正常运行。
如果使用的是 Visual Studio,并且要从 IDE 中启动控制台应用程序:
按 CTRL-F5(启动而不调试)将启动应用程序,并使控制台窗口保持打开状态,直到您按任意键。
评论
如果实际在 Visual C++ 中调试应用程序,请按 F5 或工具栏上的绿色三角形。如果您没有真正调试它(没有设置断点),请按 Ctrl+F5 或在菜单上选择“开始(不调试)”(它通常位于“调试”菜单上,我同意这会令人困惑。它会更快一点,对你来说更重要的是,它会在最后暂停,而你不必更改你的代码。
或者,打开命令提示符,导航到 exe 所在的文件夹,然后通过键入其名称来运行它。这样,当它完成运行时,命令提示符不会关闭,你可以看到输出。我更喜欢这两种方法,而不是添加在应用程序完成时停止应用程序的代码。
好的,我猜你是在使用 Visual Studio 的 Windows 上......为什么?好吧,因为如果您使用的是某种 Linux 操作系统,那么您可能会从控制台运行它。
无论如何,您可以像其他人建议的那样在程序末尾添加废话,或者只需按 CTRL + F5(开始而不调试),Visual Studio 将在完成后离开控制台。
如果要运行调试版本并且不向代码添加废话,另一个选项是打开控制台窗口(“开始”->“运行”-> cmd)并导航到“调试”输出目录。然后,只需输入可执行文件的名称,它就会在控制台中运行您的调试程序。然后,如果确实需要,可以使用 Visual Studio 的附加到进程或其他东西。
我通常只是在右大括号上放一个断点。当通过任何方式到达程序结束时,断点将命中,您可以按 Alt-Tab 键转到控制台窗口以查看输出。main()
在 中 的任何函数或任何 s 之前添加以下行:exit()
return
main()
std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
评论
你也可以坚持下去
while(true)
;
或
for(;;)
;
在最后。
评论
您甚至可以在函数的开头声明一个整数(例如),并放在返回值之前。因此,程序将继续运行,直到您按一个键并进入。main()
int a;
std::cin >> a;
如果您使用的是 Microsoft 的 Visual C++ 2010 Express,并且遇到 CTRL+F5 在程序终止后无法保持控制台打开的问题,请查看此 MSDN 线程。
您的 IDE 可能设置为在 CTRL+F5 运行后关闭控制台;实际上,默认情况下,Visual C++ 2010 中的“空项目”会关闭控制台。要更改此问题,请按照 Microsoft 版主的建议执行:
请右键单击您的项目名称并转到“属性”页面,请展开“配置属性”->“链接器”-“>系统”,请在“子系统”下拉列表中选择“控制台”(/SUBSYSTEM:CONSOLE)。因为,默认情况下,Empty 项目不会指定它。
评论
只需在程序末尾添加以下内容即可。它将尝试捕获某种形式的用户输入,从而阻止控制台自动关闭。
cin.get();
这似乎效果很好:
cin.clear();
cin.ignore(2);
如果您先清除缓冲区,则在阅读下一个缓冲区时不会有问题。
由于某种原因不起作用,它必须是 2。cin.ignore(1)
评论
cin.rdbuf()->in_avail
通话 2 次:cin.get();
//...
cin.get();
cin.get();
return 0
}
评论
你所要做的就是为 x 设置一个变量,然后在返回 0 之前输入它;
cout<<"\nPress any key and hit enter to end...";
cin>>x;
在代码末尾之前,插入以下行:
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
}
评论
system("pause > nul");
您始终可以只创建一个批处理文件。例如,如果您的程序名为 helloworld.exe,则某些代码将是:
@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
评论
system("pause >nul")
如果您运行的是 Windows,则可以执行 或 。它执行控制台命令以暂停程序,直到您按下某个键。 阻止它说.system("pause >nul");
system("pause");
>nul
Press any key to continue...
我在程序的最后一个返回 0 处放置一个断点。它工作正常。
评论
只是
#include <cstdio>
int main(){
// code...
std::getchar();
std::getchar();
return 0;
}
出于某种原因,当您运行程序时,通常可以在 stdin 中使用 getchar 读取 1 个字符。因此,第一个 getchar 读取此字符,第二个 getchar 在退出程序之前等待用户(您的)输入。在程序退出大多数终端后,尤其是在Windows上立即关闭终端。 因此,我们的目标是一种简单的方法来防止程序在输出所有内容后完成。 当然,还有更复杂、更干净的方法可以解决这个问题,但这是最简单的。
评论
在代码末尾,在 之前包含 和conio.h
return 0
_getch();
只需将其放在代码的末尾:
而(1){ }
此功能将永远持续(或直到您关闭控制台),并防止控制台自行关闭。
在调试模式下启动,使用 F5 运行代码 若要停止控制台应用,请不要单击红叉,而是按 CTRL-break 您将在程序结束时命中所有断点。
对于 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();
请注意,这使用宏与多个“字符集”(VC++ 称之为字符集)兼容。tchar.h
我用过,这很有效,但有一天我需要在此之前使用另一个来抓住中间有空白字符的绳子。因此,没有避免命令提示符窗口关闭。最后我找到了另一种方法:
按 CTRL+F5 在外部窗口中打开,Visual Studio 不再控制它。只是在最终命令运行后会询问您有关关闭的问题。cin.get()
cin.get([Array Variable])
cin.get()
我只是这样做:
//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 更好,但它有点啰嗦,通常没有必要。
评论
我试着在最后放一个函数。但它没有用。所以我所做的是一个接一个地添加两个函数。我认为第一个吸收了您在最后一次数据输入后按下的键。因此,请尝试添加两个函数而不是一个函数getchar()
getchar()
getchar()
Entergetchar()
与其按下运行按钮,不如同时按 CTRL 和 F5,它会为您提供按任意键继续消息。或者在主要功能的末尾键入“(警告仅将其用于测试而不是实际程序,因为防病毒软件不喜欢它!!!)”但是:(警告仅将其用于测试而不是实际程序,因为防病毒软件不喜欢它!!!)
使用&就像下面的代码一样。#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
system("pause >nul")
与yeh答案类似的想法,只是极简主义的选择。
创建包含以下内容的批处理文件:
helloworld.exe
pause
然后使用批处理文件。
只需在返回 0 之前使用 cin.ignore();两次
main()
{
//your codes
cin.ignore();
cin.ignore();
return 0;
}
就这样
评论
您也可以尝试这样做
sleep (50000);
cout << "any text" << endl;
这将将您的代码保存 50000m,然后打印消息并关闭。但请记住,它不会永远暂停。
这是一个问题,不是那么明显。不知何故,我在程序的最后一行添加了一个调试断点。 不知道我是怎么做到的,也许是在不同屏幕之间跳转时错误地点击鼠标。我在 VS Code 中工作。}
当我进行调试时,系统会立即跳转到该断点。没有错误消息,没有临时输出,什么都没有。我想,程序是如何冲过我所有设置的断点的?这花了太长时间才弄清楚。
显然,系统将最后一行断点视为“第一个”停止点。简单的解决方法?删除该断点,呵呵!(在此处插入额头拍打。
在我为OpenCV C++开发设置Visual Studio后,我遇到了这个问题(更像是一个功能而不是问题)。我必须启用控制台的自动关闭。当运行在控制台中返回输出的普通 C++ 程序时,它会立即关闭。 我在另一个问题中找到了解决方案,它奏效了:
https://stackoverflow.com/a/54084067/15012520
转到Tools >> Options >> Debugging >> General >> Automatically close the console when debugging stops.
评论