在C ++程序中暂停控制台

在C ++程序中暂停控制台的最佳方法是什么?

  1. 使用cin.get()
  2. 或使用system("pause")
  3. 或使用C函数,如getch()getchar()

system("pause")使用system("pause")导致非可移植代码并且不能在UNIX中工作是真的吗?

cin.get()最好用来暂停控制台吗?

有可能是一个最好的方法(如使用便携式cin.get() ), 但一个方法不存在 。 一个已经完成工作的程序应该退出,并将其资源回馈给计算机。

是的, system()任何用法都会导致不可移植的代码,因为参数被传递给拥有进程的shell。

在源代码中暂停代码迟早会引起麻烦:

  • 有人忘记在登记前删除暂停代码
    • 现在所有的工作伙伴都不知道为什么应用程序不再closures
    • 版本历史被污染
  • #define是地狱
  • 任何从控制台运行代码的人都很烦恼
  • 尝试从脚本中启动和结束程序是非常,非常非常烦人的; 如果你的程序是shell中pipe道的一部分的话,会很烦人,因为如果程序没有结束,shell脚本或者pipe道也不会

相反,探索你的IDE。 它可能有一个选项不运行后closures控制台窗口。 如果不是的话,作为一个值得她/他的钱的开发者,总是在附近打开一个控制台窗口是一个很好的理由。

另外,你可以把它作为一个程序选项,但是我个人从来没有看过一个带有一个选项的程序--keep-alive-when-dead

故事的道德:这是用户的问题,而不是程序的问题。 不要污染你的代码。

如果你想编写可移植的C ++代码,那么我build议使用cin.get()

system("PAUSE")在Windows上工作,因为它需要执行名为“ PAUSE ”的控制台命令。 但我不确定其他操作系统如Linux或其他Unix衍生产品如何支持。 所以这往往是不可移植的。

由于C ++已经提供了cin.get() ,我没有看到使用C getch()强制性理由。

没有好的办法做到这一点,但你应该使用便携式解决scheme,所以避免system()调用,在你的情况下,你可以使用cin.get()getch()就像你在问题中提到的一样,也有一个build议。 使所有暂停由一个(或极less数)预处理器定义控制。

例如:

全局文件中的某处:

 #define USE_PAUSES #ifndef _DEBUG //I asume you have _DEBUG definition for debug and don't have it for release build #undef USE_PAUSES #endif 

在代码的某处

 #ifdef USE_PAUSES cin.get(); #endif 

这不是通用的build议,但是你应该保护自己免于暂停发布版本,这些应该很容易控制,我提到的全局文件可能不是那么全球化,因为改变可能会导致真正长的编译。

在C ++程序中暂停控制台的最佳方法是什么?

system("pause");getch(); (来自DOS世界,IIRC)都是不可移植的。

cin.get()最好用来暂停控制台吗?

作为唯一的可移植标准选项,我会说是这样,但我个人认为不应该编写交互式控制台程序,即实际上暂停控制台或提示input的程序(除非有真正的理由,因为这使得shell脚本更难)。 控制台程序应该通过命令行参数与用户交互(或者至less这种交互应该是默认的)。

以防万一你需要暂停程序,以便我的程序从IDE开始,立即closures,但是我不能够有足够的时间去查看这个程序,结果原因 – 不要这样做。 只需从控制台configuration您的IDE或启动控制台程序。

最好的方法很大程度上取决于所针对的平台,debugging与发布的使用情况等。

我不认为有一个最好的方法,但是要以相当通用的方式“强制”inputtypes场景,特别是在debugging时(通常是基于NDEBUG_DEBUG编译进或输出),您可以尝试std::getline如下

 inline void wait_on_enter() { std::string dummy; std::cout << "Enter to continue..." << std::endl; std::getline(std::cin, dummy); } 

随着我们没有“进入继续”,根据需要。

我只想补充说,有一种方法可以得到你想要的,但是需要使用一些第三方库(或者你自己编写平台相关的代码)。

就我而言,cin最大的缺点是你必须打回车,而不是任何键。

假设你有一个关键的听众,你可以很容易地写一个函数,等待用户打任何键。 然而find一个独立于平台的键监听器并不是一件容易的事,而且很可能会要求你加载更大的库的一部分。

我正在思考的是:

 char wait_for_key() { int key; while ( ! (key == key_pressed(ANY)) ) { this_thread::yield(); } return convert_virtual_key_to_char(key); } 

实际function显然会与我所写的完全不同,具体取决于您使用的库。

我知道下面的库有keylisteners(如果你知道的话,可以随意在编辑中添加更多内容):

  • 关键代码
  • SDL

我总是使用几行代码来清除任何字符的inputstream,然后等待input忽略。

就像是:

 void pause() { cin.clear(); cout << endl << "Press any key to continue..."; cin.ignore(); } 

然后任何时候我需要它在程序中我有我自己的暂停(); function,而没有系统暂停的开销。 编写控制台程序时,这只是一个真正的问题,您仍然希望保持打开状态或留在某个特定点上。

这对我有用。

 void pause() { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); std::string dummy; std::cout << "Press any key to continue . . ."; std::getline(std::cin, dummy); }