编译控制台程序后,控制台窗口在运行后立即关闭。保持开放的最佳做法是什么?我已经搜索了谷歌加载,我习惯了你不必担心它的代码块,但是,我想稍微使用Visual Studio并且使用VS,我的控制台关闭了。整个interwebz有几种不同的方式来保持它开放,但是,我已经读过它们大多数都是糟糕的编码技术。什么是每个人首选的方法?
答案 0 :(得分:21)
当我使用Visual Studio而我不需要调试时,我只需使用 Ctrl + F5 按键运行它 - 它会阻止控制台关闭。
答案 1 :(得分:13)
由于您始终在调试器中运行,因此请在main()
的return语句中设置断点。
调试器是你最好的朋友,学习(并尽早学习),在每个机会都利用它。
答案 2 :(得分:6)
在控制台中运行程序,这将是运行控制台程序的预期方式......
或者,您可以创建一个小批处理文件来执行您的程序:
REM batch file to launch program
yourprogram.exe
PAUSE
并且PAUSE
cmd.exe命令将要求用户按任意键。
答案 3 :(得分:5)
cin
非常不优雅,但对于健忘的人来说很容易:
{
char c;
std::cin >> c;
}
保持窗口打开,直到您键入字符/ * edit * /并按Enter键。
当你输入一个角色时, std::cin.get()
会关闭窗口,这取决于你习惯的习惯,“哎呀,我希望我没有关闭那个!”而不是双击operator>>(istream &)
。
两者都不同于system("pause")
,因为它们以程序可访问的方式返回您键入的字符的值,因此,如果不经常发生,一个kludge导致另一个,您可以编写一个switch语句根据您输入的内容(例如)立即退出,将一些值写入日志,再次运行等等。
答案 4 :(得分:4)
我倾向于使用system("PAUSE");
给你一个
Press any key to continue . . .
消息。
答案 5 :(得分:3)
答案 6 :(得分:3)
抵制做任何事情的诱惑。表现良好的命令行程序在完成运行后通过退出代码报告状态时退出。这使他们能够在自动化环境中编写脚本并成为“好公民”。即使在交互式环境中,为什么强迫用户仅仅因为您的调试环境而进行额外的按键操作?
如果您运行,而不是调试,则Visual Studio将打开一个控制台窗口,该窗口会在您的应用程序退出后暂停,以便您仍然可以查看输出。我不知道为什么调试时行为会有所不同,可能是因为你有断点可用,所以如果你想在各个阶段看到输出,你可以在相关的输出语句之后放置断点,或者在{{1}的末尾。或者启用各种'stop on exception throw'选项。
无论是什么原因,我都不会因为增强我的调试体验而不得不妥协我的应用程序的行为。
答案 7 :(得分:2)
一个非常常见的方法是在主应用程序代码关闭后输入代码从控制台读取密钥。读取的键击会被丢弃,但它会使控制台保持打开状态。
它不是很好,必然 - 但我经常将它包含在调试定义中,因此在调试期间,控制台保持打开状态。在发布期间,我通常不在VS内部运行,并且从命令行运行时,这不再是一个问题。
答案 8 :(得分:1)
这个帖子中的“不要那样做”的回答可能看起来很简陋,但它们是相当明智的。我碰巧遇到了这个问题,因为我正在调试一个曾经运行良好的gtest套件,但现在在启动时会神秘地崩溃。从控制台运行时,会弹出一个对话框,说“blah.exe已停止工作”;但是,从调试器运行时,控制台会暂时弹出,消失,程序退出时为0状态。
我应该一直在思考这种行为差异有多奇怪,但我却是这样:“噢,伙计---我必须让控制台窗口保持原状,这样才能看出它的内容。”正确?
事实证明,我正在处理的机器(我的同事)将调试器的'Command Arguments'设置为'--gtest_filter = * testMsg *'。我也马上注意到了这一点,但我从未想到所有匹配过滤器的测试都是在最近的提交中重命名的。因此,当从调试器启动时,gtest没有找到任何运行的测试,只是退出。我生命中的另外90分钟我永远不会回来。 (-_-)如果我的膝跳反应没想到我需要控制台窗口保持打开以便解决问题,我本可以更快地抛弃这个焦油宝宝......
答案 9 :(得分:0)
在主要结束时返回之前调用此函数:
void onEnd()
{
printf("Press any key to exit...");
_getch();
}