C++中的控制台暂停?

23

在C#中,您可以使控制台等待输入一个字符(这对于能够在程序退出之前查看控制台的最后输出非常有用)。作为C++初学者,我不确定相应的方法是什么。是否有类似的方法呢?


2
什么是解决控制台关闭问题的最佳实践? - Christian Severin
如果这是Windows,那么它就是@Christian链接的副本。投票关闭。 - sbi
4个回答

35
最简单的方法就是:
std::cin.get();

你可以在此之前打印一些类似于“按任意键继续...”的内容。有些人会告诉你关于

system("pause");

但不要使用它。它不具备可移植性。


8
请注意,虽然cin.get()应该只读取一个字符,但你的终端可能进行行缓冲,所以在调用get()之前需要按下回车键。 - Alex Jasmin
这两个示例的行为不同,cin.get() 等待用户按下 ENTER 键,而 system("pause") 一旦用户按下任意键就立即返回。 - SoLaR

5
#include <stdio.h>
// ...
getchar();

这个函数等待单个按键并返回其整数值。

例如,我有一个函数,它可以像System("pause")一样运行,但不需要"pause.exe"(顺便说一下,这是一个潜在的安全漏洞):

void pause()
{
  std::cout << std::endl << "Press any key to continue...";
  getchar();
}

5
жІЎжңү pause.exeпјҢpauseжң¬иә«жҳҜWindows shellдёӯзҡ„еҶ…зҪ®е‘Ҫд»ӨгҖӮ - Greg Hewgill
2
嗯,我原本以为命令“pause”会导致运行整个进程,基本上就是程序“暂停”。例如,在Windows上,system("notepad")启动记事本,因此这个命令绝对可以启动其他可执行文件。 - Mephane
不同的是:getchar(); 在返回之前等待按下 ENTER 键。 - SoLaR

3

标准中没有相关内容,也没有跨平台的解决方法。通常的做法是等待用户按下<Enter>键,然后丢弃输入结果。


C++标准库被纳入ANSI/C++ ISO语言标准中,包含类istream的std::cin。这是跨平台的,而且不是“什么都没有”。 - Abel

1

不正确的解决方案是使用 system("pause"),因为它会创建安全漏洞(目录中的恶意 pause.exe!)并且不跨平台(pause 仅存在于 Windows/DOS 上)。

有一个更简单的解决方案:

void myPause() {
    printf("Press any key to continue . . .");
    getchar();
}

这里使用的是 POSIX 兼容的 getchar() 函数(参见 this)。 你可以像这样使用该函数:

int main() {
    ...
    myPause();
}

这将有效地防止控制台闪烁并退出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接