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

最近,我一直在试图从这个网站学习C ++。 不幸的是,当我尝试运行其中一个代码示例时,我发现程序打开了大约半秒钟,然后立即closures。 有没有办法阻止程序立即closures,以便我可以看到我努力的成果?

编辑:正如Charles Bailey在下面的评论中正确地指出的那样,如果字符缓冲在stdin中,这将不起作用,并且实际上没有办法解决这个问题。 如果您正在运行debugging器, John Diblingbuild议的解决scheme可能是解决您的问题的最简单的解决scheme。

也就是说,我会在这里留下,也许别人会觉得它有用。 在开发过程中编写testing的时候,我已经把它用作了很多种类的东西。


main函数结束时,可以调用std::getchar();

这将从stdin得到一个单一的字符,从而给你“按任何键继续”的行为(如果你真的想要“按任意键”的消息,你将不得不自己打印一个)。

您需要为#include <cstdio>

如果您正在使用Visual Studio,并且正在从IDE中启动控制台应用程序:

按下CTRL-F5 (开始不debugging)将启动应用程序,并保持控制台窗口打开,直到您按任何键。

James的解决scheme适用于所有平台。

或者在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运行后closures控制台; 实际上,Visual C ++ 2010中的“空项目”在默认情况下会closures控制台。 要改变这种情况,请按照Microsoft版主的build议:

请右键点击您的项目名称,进入属性页面,展开configuration属性 – >链接器 – >系统,请在子系统下拉列表中select控制台(/ SUBSYSTEM:CONSOLE)。 因为默认情况下,Empty项目没有指定它。

我通常只在main()的闭合花括号上放置一个断点。 当以任何方式达到程序结束时,断点将会被触发,并且您可以通过ALT-Tab到控制台窗口来查看输出。

为什么不从控制台运行程序,即如果您使用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 } 

如果您从主pipeIDE(如Code :: Blocks)运行代码,则IDE将pipe理它用来运行代码的控制台,并在应用程序closures时保持打开状态。 您不想添加特殊的代码来保持控制台的打开状态,因为当您在IDE之外使用它时,这会阻止其正常运行。

如果实际上在Visual C ++中debugging应用程序,请按F5或工具栏上的绿色三angular形。 如果你没有真正debugging它(没有设置断点),请按Ctrl + F5或者在菜单上selectStart Without Debugging(它通常在Debug菜单上,我同意这会让人困惑)。它会快一点,更重要的是对你来说,最后会暂停而不必改变你的代码。

或者,打开命令提示符,导航到您的exe文件所在的文件夹,然后通过键入其名称来运行它。 这样当完成运行命令提示符不会closures,你可以看到输出。 我更喜欢这两种方法添加停止应用程序的代码。

好吧,我猜你正在使用Visual Studio的Windows …为什么? 那么,因为如果你在某种Linux操作系统,那么你可能会从控制台运行它。

无论如何,你可以像其他人一样将废话添加到你的程序的末尾,或者你可以点击CTRL + F5 (开始时不需要debugging),Visual Studio会在完成后离开控制台。

另一个选项,如果你想运行debugging版本,而不是添加废话到你的代码是打开控制台窗口(开始 – >运行 – > CMD),并导航到您的debugging输出目录 。 然后,只需input您的可执行文件的名称,它将在控制台中运行您的debugging程序。 然后,您可以使用Visual Studio的附件来处理或者如果您真的想要的话。

在程序的最后添加以下内容。 它会尝试捕捉某种forms的用户input,从而停止控制台自动closures。

 cin.get(); 

在任何exit()函数之前或main()任何return之前添加以下行:

 std::cout << "Paused, press ENTER to continue." << std::endl; cin.ignore(100000, "\n"); 

对于Visual Studio(以及仅Visual Studio),下面的代码片段为您提供了一个“等待按键继续”提示,通过首先清空input缓冲区,真正等待用户明确按下新的按键:

 #include <cstdio> #include <tchar.h> #include <conio.h> _tprintf(_T("Press a key to continue ")); while( _kbhit() /* defined in conio.h */ ) _gettch(); _gettch(); 

请注意,这使用tchar.hmacros来兼容多个“字符集”(如VC ++调用它们)。

而不是按下运行button,同时按CTRL和F5,它会给你按任何键来继续消息。 或者在主函数的末尾input“(警告只用于testing不是实际的程序,因为antiviruses不喜欢它!!!!)”,但是:(警告只用于testing不是真正的程序作为antiviruses不喜欢它!)

使用#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"); } 

查看您的IDE是否在项目设置中有checkbox,以便在程序终止后保持窗口打开。 如果没有,使用std::cin.get(); 在主函数结束时读取一个字符。 但是,一定要只使用基于行的input(std :: getline),否则处理剩余的未读字符(std :: ignore直到换行符),否则最后的.get()将只读取你剩下的垃圾未读。

这似乎运作良好:

 cin.clear(); cin.ignore(2); 

如果您先清除缓冲区,则在读取下一个缓冲区时不会出现问题。 出于某种原因, cin.ignore(1)不起作用,它必须是2。

所有你必须做的为x设置一个variables,然后在返回0之前input这个;

 cout<<"\nPress any key and hit enter to end..."; cin>>x; 

你甚至可以在main()函数的开头声明一个整数(比如int a; ),并把std::cin >> a; 就在返回值之前。 所以程序将继续运行,直到你按下一个键并进入。

你总是可以创build一个batch file。 例如,如果你的程序叫做helloworld.exe,那么一些代码是:

 @echo off :1 cls call helloworld.exe pause >nul goto :1 

我在程序的最后一个返回0处设置了一个断点。 它工作正常。

只是

 int main(){ // code... getchar(); getchar(); return 0; } 

我使用cin.get() ,这是工作,但有一天,我需要使用另一个cin.get([Array Variable])之前,抓住一个空字符在中间的凌弦。 所以cin.get()没有避免closures命令提示符窗口。 最后我find了另一种方法:按下CTRL + F5在外部窗口中打开,Visual Studio不再控制它。 在最后的命令运行之后,只会问你closures。

我只是这样做:

 //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()会吸收最后一个数据input后按的Enter键。 所以尝试添加两个getchar()函数而不是一个

类似的想法你ye回答,只是最低限度的select。

创build一个包含以下内容的batch file:

 helloworld.exe pause 

然后使用batch file。

 #include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; int main() { cout << "Press any key to continue..."; getch(); return 0; } 

我没有注意到任何人发布这个,所以在这里。

只是在返回0之前使用cin.ignore()。 两次

 main() { //your codes cin.ignore(); cin.ignore(); return 0; } 

就这样

如果你正在运行Windows,那么你可以做system("pause >nul");system("pause"); 。 它执行一个控制台命令暂停程序,直到您按下一个键。 >nul阻止它说话Press any key to continue...