等待用户输入的C++代码

145

在控制台应用程序中,等待用户输入的最佳方法是什么?

std::cout << "press any key to exit...";
// wait for user to hit enter or another key

3
与鼠标操作或其他输入设备一样,没有标准的响应任何按键的方式(因为控制台输入功能会等待用户按下“回车”键),也没有标准的响应。 - CashCow
8
如果你想要在按下回车之前暂停:std::cin.ignore(); - Stevoisiak
4个回答

270

有几种方法可以做到这一点,以下是一些可能的一行代码:

  1. 使用 getch()(需要 #include <conio.h>)。

  2. 使用 getchar()(期望为 Enter,需要 #include <iostream>)。

  3. 使用 cin.get()(期望为 Enter,需要 #include <iostream>)。

  4. 使用 system("pause")(需要 #include <iostream>,仅适用于 Windows)。

    PS:此方法还会在屏幕上打印 Press any key to continue . . .。(似乎是你的完美选择:))


编辑:此处所讨论,没有完全可移植的解决方案。问题19.1在comp.lang.c FAQ中涵盖了这个问题,提供了Windows、类Unix系统甚至是MS-DOS和VMS的解决方案。


4
在 Microsoft VS2012 中,使用 #include <conio.h> 和 _getch()。 - CreativeMind
@herohuyongtao: getchar 会等待用户输入 Enter 键。请参考此链接 - legends2k
1
@herohuyongtao:它会报错“error C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch." - CreativeMind
4
强烈建议避免使用getch(),因为它仅适用于物理控制台,而不是stdin,因此无法与管道或文件重定向一起使用。 - Roger Sanders
4
对于 Linux,使用 unistd.h 中的 pause() 函数。pause 命令仅存在于 Microsoft 平台和一些与 PDP 或 DOS 相关的平台上。一些发行版将其声明为别名。 - Swift - Friday Pie
显示剩余5条评论

19

使用do-while循环可以很好地等待用户输入。

就像这样:

int main() 
{

 do 
 {
   cout << '\n' << "Press a key to continue...";
 } while (cin.get() != '\n');

 return 0;
}

你也可以使用函数system('PAUSE'),但我认为这种方法较慢且依赖于平台。


5
system('PAUSE') 不适用于所有系统... - Tiago
第一次使用时为什么会提示两次? - Marcello B.
1
如果std::cin被关闭(因为get()将返回EOF),那么它将无限循环。 - Toby Speight
@MarcelloB。也许您在按下回车(\n)之前输入了一个字符。在上面的代码中,该while循环会一直运行,直到cin.get()获取到'\n'。例如,如果您输入了3个字符并按下回车,则会提示“按任意键继续......”三次。 - starriet

10
没有“标准”的库函数可以实现这个功能。标准(也许令人惊讶的是)实际上并没有承认“键盘”的概念,尽管它确实有一个“控制台输入”标准。
在不同操作系统上实现此功能的方法各不相同(请参见herohuyongtao的解决方案),但它在支持键盘输入的所有平台上都无法移植。
请记住,C++(和C)被设计为可以在嵌入式系统上运行,而这些系统可能没有键盘。 (话虽如此,嵌入式系统可能没有标准库支持的其他各种设备。)
这个问题已经争论了很长时间。

9
你可以尝试。
#include <iostream>
#include <conio.h>

int main() {

    //some codes

    getch();
    return 0;
}

getch 在主函数里面还是其他地方? - doctorlove
在主函数中,在返回0之前,即您想要等待用户输入的地方。 - JustCode
1
不需要在这里包含 iostream - herohuyongtao
1
如果标准输入缓冲区中有数据,则此操作将无法正常工作... - Tiago
2
<conio.h> 是 Windows 特有的头文件。这可能是一些人编译时遇到问题的原因。不幸的是,Unix 的解决办法相当丑陋。请参见 http://c-faq.com/osdep/cbreak.html。基本问题在于 Unix 会缓冲输入直到收到换行符,而 C 的 stdin 没有绕过这个问题的方法。您需要进行系统调用以关闭缓冲。 - Edward Falk
显示剩余2条评论

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