你说你不想使用system("pause")
黑客。为什么不?
如果是因为您不希望程序在未调试时提示,那么有一种解决方法。这对我有用:
void pause () {
system ("pause");
}
int main (int argc, char ** argv) {
// If "launched", then don't let the console close at the end until
// the user has seen the report.
// (See the MSDN ConGUI sample code)
//
do {
HANDLE hConsoleOutput = ::GetStdHandle (STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == hConsoleOutput)
break;
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (0 == ::GetConsoleScreenBufferInfo (hConsoleOutput, &csbi))
break;
if (0 != csbi.dwCursorPosition.X)
break;
if (0 != csbi.dwCursorPosition.Y)
break;
if (csbi.dwSize.X <= 0)
break;
if (csbi.dwSize.Y <= 0)
break;
atexit (pause);
} while (0);
我只是将此代码粘贴到我正在编写的每个新控制台应用程序中。如果程序正在从命令窗口运行,则光标位置不会是 <0,0>,并且不会调用atexit()
. 如果它已从您的调试器(任何调试器)启动,则控制台光标位置将为 <0,0> 并且atexit()
将执行调用。
我从以前在 MSDN 库中的示例程序中得到了这个想法,但我认为它已被删除。
注意:system() 例程的 Microsoft Visual Studio 实现需要 COMSPEC 环境变量来识别命令行解释器。如果这个环境变量搞砸了——例如,如果你在 Visual Studio 项目的调试属性中遇到问题,以至于在程序启动时环境变量没有正确传递——那么它就会默默地失败.