如何阻止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.h
macros来兼容多个“字符集”(如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...