在C ++程序中暂停控制台
在C ++程序中暂停控制台的最佳方法是什么?
- 使用
cin.get()
- 或使用
system("pause")
- 或使用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); }