Visual Studio控制台程序输出窗口一闪而过的解决方法

时间:2024-03-30 16:20:45

刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样。无论是在Visual Studio 2008、2010还是2012中都有这种情况出现,有些人可能会用下面两种方法中的一种:
在程序代码的最后加上system(“pause”)或者getchar()。其实这是属于dos下的命令。

1. 你执行时按的是F5,而正确的应该是Ctrl+F5


其实问题是你执行时按的是F5,而正确的应该是Ctrl+F5,这样窗口就会显示 Press any key to continue…这句话了。也可以看到程序运行的结果了。
因为,F5是Debugging模式,在这个模式下,当程序运行结束后,窗口不会继续保持打开状态。而Ctrl+F5是 Start Without Debugging模式,在这个模式下,就可以看到运行结果了。

如果你按Ctrl+F5仍然是一闪而过的话,那么请按照如下设置:
在工程上右键—>属性—>配置属性—>连接器—>系统—>子系统(在窗口右边)—>下拉框选择控制台(/SUBSYSTEM:CONSOLE)
就OK啦~

2. 其他语句

较常用的做法是使用system(“pause”),这篇文章Things to Avoid in C/C++ – system(“pause”)不推荐使用”system(“pause”),因为:
1、不可移植。只适合Dos或Windows,不适合Linux等
2、耗费系统资源。调用系统命令system()去做”暂停程序”的事情有点大材小用。
3、必须添加头文件:stdlib.h或者cstdlib
所以,应该尽量摒弃。

推荐方法:
1、 C中,使用getchar();
2、 C++中,使用cin.get();


丰富一下两种替代方法: 1、C中

printf(“按任意键继续……”);

getchar();

2、C++中

cout<<”按任意键继续……”;

cin.clear();

cin.sync();

cin.get();

备注:加上cin.clear(),cin.sync()这句,cin.clear() 用于清除输入流的失败状态(如果有),使其恢复正常;cin.sync();是清空缓存区,让cin.get()真正接收到你的键盘输入。

为什么加上cin.get()控制台窗口就会停在那了呢?

原因是:程序跑到这个位置就会停下来,等你输入一个字符(前提是输入缓冲区中没有字符,否则会直接从输入缓冲区中直接取,而不是等待键盘输入)

我在网上看到这样的解析:

大多数同学 C++ 的同学写的第一个程序都是 Hello world,八成也都能跑出来。但是差不多都是 cmd 窗口就一闪而过了,什么都看不清楚。要解决这个问题,可以在 main() 中的 return 语句前加一句 cin.get()。这样的话,程序跑到这个位置就会停下来,等你输入一个字符。代码如下(以下代码用的 IDE 是 wxDev-C++):
Visual Studio控制台程序输出窗口一闪而过的解决方法

但是,如果在 cin.get() 前有 cin,那么这个方法就很可能失效了。下面的这个代码中的 cin.get() 就不会其作用:
Visual Studio控制台程序输出窗口一闪而过的解决方法

原因是,在第一次使用 cin 后,我们没有清空流。所以当第二次使用 cin 时,输入流不是空的(输入是一个数字(比如 4),后面是一个空白符;而 cin 将接受这个数字,但是剩余一个空白符)。所以,cin 会从输入流中提取,而不是要求键盘输入。

要使 cin.get() 大法还有用,可以配对使用 cin.clear() 与 cin.sync()。两个函数:cin.clear() 用于清除输入流的失败状态(如果有),使其恢复正常;而 cin.sync() 用于清空输入流。代码如下:
Visual Studio控制台程序输出窗口一闪而过的解决方法

这样的话,cin.get() 就会请求键盘输入一个字符。