什么是打击控制台closures问题的最佳做法?

编译控制台程序后,控制台窗口在运行后立即closures。 保持开放的最佳做法是什么? 我search谷歌加载,我习惯了代码块,你不必担心它,但是,我想用Visual Studio和VS混淆,我的控制台closures。 整个interwebz有几种不同的方式来保持它的开放,但是,我已经读到,其中大多数是不好的编码技术。 大家喜欢什么方法?

Solutions Collecting From Web of "什么是打击控制台closures问题的最佳做法?"

当我使用Visual Studio,而且我不需要调试时,只需使用Ctrl + F5按键来运行它,并防止控制台关闭。

由于您总是在调试器中运行,因此在main()的return语句上设置一个断点。

调试器是你最好的朋友,学习(学习早),利用它在每一个机会你的优势。

在控制台中运行你的程序,这将是运行控制台程序的预期方式。

或者,您可以制作一个批处理文件来执行您的程序,该程序将具有:

 REM batch file to launch program yourprogram.exe PAUSE 

并且PAUSE cmd.exe命令将要求用户按任意键。

cin是非常不雅的,但容易忘记派生:

 { char c; std::cin >> c; } 

直到你输入一个字符/ *编辑* /并按回车键,窗口才会打开。

std::cin.get()会在你输入一个字符的那一刻关闭窗口,这取决于你习惯了多容易,冒着“哎呀,我希望我没有关闭它”的风险稍大一些。 operator>>(istream &)operator>>(istream &)

这两者都不同于system("pause") ,因为它们以程序可访问的方式返回您输入的字符的值,所以,如果不常发生,一个kludge会导致另一个kludge,您可以根据你输入的内容(例如)立即退出,将一些值写入日志,再次运行等等。

我倾向于使用system("PAUSE"); 这给你一个

Press any key to continue . . .

信息。

我用:

 cin.get() 

我听说它比系统(“PAUSE”)的成本更低,而且它也可以在POSIX系统上运行。 有一个伟大的链接 ,详细介绍了这一点。

抵制诱惑做任何事情。 行为良好的命令行程序在完成运行后通过退出代码报告状态时退出。 这使他们能够在自动化环境中成为脚本和“好公民”。 即使在交互式环境中,为什么只是因为您的调试环境而迫使用户进行额外的按键操作呢?

如果运行而不是调试,Visual Studio将打开一个控制台窗口,在应用程序退出后暂停,以便仍然可以查看输出。 我不知道为什么当你调试时行为是不同的,也许是因为你有断点可用,所以如果你想在各个阶段看到输出,你可以在相关的输出语句之后放置断点,或者在main或end的结尾“停止异常抛出”选项。

不管是什么原因,我从来没有觉得为了增强我的调试体验而不得不妥协我的应用程序的行为。

一个非常普通的方法就是在主应用程序代码关闭后,在代码中从控制台读取一个密钥。 刚才读入的按键会被丢弃,但是它保持着控制台的打开状态。

这不是很漂亮,但是我经常用调试定义包装,所以在调试过程中,控制台保持打开状态。 在发布期间,我通常不会在VS中运行,而从命令行运行时,这不再是问题。

这个线程中的“不这样做”的反应可能看起来很简单,但是它们相当明智。 我遇到过这个问题,因为我正在调试一个运行良好的gtest套件,但是现在在启动时神秘崩溃。 当从控制台运行时,它弹出一个对话框,说“blah.exe已停止工作”; 但是当从调试器运行时,控制台瞬间弹出,消失,程序以0状态退出。

我应该一直在思考这种行为差异是多么的奇怪,但是我却是这样想的:“呃,伙计 – 我得让那个控制台窗口保持上去,这样我就能看到它说了什么。 对?

事实证明,我正在使用的机器(我的一个同事)的调试器的“命令参数”设置为“–gtest_filter = * testMsg *”。 我也注意到了这一点,但是我从来没有想到,所有匹配过滤器的测试都在最近的提交中被重命名了。 所以,从调试器启动时,gtest没有找到任何测试运行,只是退出。 我的另一个90分钟,我永远不会回来。 (-_-)如果我的膝盖反应没有想到我需要控制台窗口保持打开状态以解决问题,我可以早点放弃这个焦油宝宝…

在main函数返回之前调用这个函数:

 void onEnd() { printf("Press any key to exit..."); _getch(); }