【问题标题】:C++ wait for user input [duplicate]C ++等待用户输入[重复]
【发布时间】:2014-01-21 12:00:19
【问题描述】:

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

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

【问题讨论】:

  • 没有标准方式来响应任何按键(因为控制台输入功能等待用户点击“输入”),就像没有标准方式来响应鼠标操作或任何其他输入一样设备。
  • 如果你想暂停直到按回车:std::cin.ignore();

标签: c++


【解决方案1】:

有几种方法可以做到这一点,这里有一些可能的单行方法:

  1. 使用getch()(需要#include &lt;conio.h&gt;)。

  2. 使用getchar()(需要Enter,需要#include &lt;iostream&gt;)。

  3. 使用cin.get()(需要Enter,需要#include &lt;iostream&gt;)。

  4. 使用 system("pause")(需要 #include &lt;iostream&gt;仅限 Windows)。

    PS:这个方法也会在屏幕上打印Press any key to continue . . .。 (对你来说似乎是完美的选择:))


编辑: 正如here 所讨论的,对此没有完全可移植的解决方案。 comp.lang.c FAQ 的问题 19.1 对此进行了深入探讨,提供了适用于 Windows、类 Unix 系统甚至 MS-DOS 和 VMS 的解决方案。

【讨论】:

  • 在 Microsoft VS2012 中,使用 include #include 和 _getch()。
  • 我强烈建议避免使用 getch(),因为它只适用于物理控制台,而不适用于标准输入,因此不适用于管道或文件重定向。
  • system("pause") 在 linux/unix 上不起作用,我会在答案中指定。
  • @herohuyongtao 不,它没有。请在 Linux/Unix 上编译一个调用 system("pause") 的应用程序并亲自查看。我不是在谈论 system()( 函数。而是使用“暂停”作为命令。
  • 对于 linux,使用 unistd.h 中的 pause()。 pause 命令仅存在于 microsoft 平台上,很少有 pdp 或 dos 相关的。一些发行版将其作为别名声明
【解决方案2】:

do while 循环是等待用户输入的好方法。 像这样:

int main() 
{

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

 return 0;
}

您也可以使用函数system('PAUSE'),但我认为这有点慢并且取决于平台

【讨论】:

  • system('PAUSE') 并非在所有系统上都可用...
  • 为什么第一次使用这个提示两次?
  • 如果std::cin 关闭,它将无限循环(因为get() 将返回EOF)。
【解决方案3】:

没有“标准”库函数可以做到这一点。该标准(也许令人惊讶)实际上并没有承认“键盘”的概念,尽管它确实有一个“控制台输入”的标准。

有多种方法可以在不同的操作系统上实现它(参见 herohuyongtao 的解决方案),但它不能在所有支持键盘输入的平台上移植。

请记住,C++(和 C)被设计为可以在没有键盘的嵌入式系统上运行的语言。 (话虽如此,嵌入式系统可能没有标准库支持的各种其他设备。

这件事争论了很久。

【讨论】:

    【解决方案4】:

    你可以试试

    #include <iostream>
    #include <conio.h>
    
    int main() {
    
        //some codes
    
        getch();
        return 0;
    }
    

    【讨论】:

    • 主要是getch 还是什么?
    • 在主函数中返回 0; ,IE。您要等待用户输入的位置
    • 这里不需要包含iostream
    • 如果标准输入缓冲区中有数据,这将不起作用...
    • 是 Windows 主义。这可能就是为什么有些人无法编译它的原因。不幸的是,Unix 解决方案非常丑陋。见c-faq.com/osdep/cbreak.html。基本问题是 Unix 缓冲输入直到收到换行符,而 C 的标准输入无法解决这个问题。您需要进行系统调用以关闭缓冲。
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2012-05-21
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多