【问题标题】:How to read user input without pressing ENTER?如何在不按 ENTER 的情况下读取用户输入?
【发布时间】:2022-01-01 09:50:54
【问题描述】:

我正在编写无需用户按 ENTER 即可获得输入的代码。 该代码基本上是我需要从 1-6 中获取 4 个数字,而无需用户在一行中全部按 ENTER。

我尝试使用getchar() 这样做,但它不起作用。

我该怎么做?

这是那部分代码:

int p1 = 0;
int p2 = 0;
int p3 = 0;
int p4 = 0;
p1 = getchar() - 48;
p2 = getchar() - 48;
p3 = getchar() - 48;
p4 = getchar() - 48;

【问题讨论】:

  • 对此没有标准功能。您将不得不使用特定于操作系统的东西。请注意,original designers of C 使用了一个单独的终端,在您按下 Enter 之前不会向计算机发送任何内容。
  • 将它们全部输入一行,不带空格,然后按一次。例如1234<Enter>。另外:请将“幻数”48 替换为'0'
  • 在 MSVC 中,您可以使用 _getch()_getche()
  • 如何将输入作为字符串行,拆分并转换为整数?

标签: c


【解决方案1】:

这是一个 C 常见问题解答:12.5 How can I read one character at a time, without waiting for the RETURN key?

引用:

根据您使用的操作系统和可用的库,您可以使用以下一种(或多种!)技术:

  • 如果您可以使用 curses 库,则可以调用 cbreak [footnote](也许还有 noecho),之后调用 getch 将立即返回字符。
  • 如果您只想读取一个不带回显的短密码,则可以使用名为 getpass 的函数(如果可用)。 (隐藏输入密码的另一种可能性是选择黑色背景上的黑色字符。)
  • classic 版本的 Unix 下,使用 ioctl 以及对文件描述符 0 的 TIOCGETP 和 TIOCSETP(或 TIOCSETN)请求来操作 sgttyb 结构,该结构在 中定义并在 tty( 4)。在 sg_flags 字段中,设置 CBREAK(或 RAW)位,并可能清除 ECHO 位。
  • 在 System V Unix 下,使用 ioctl 以及对文件描述符 0 的 TCGETAW 和 TCSETAW 请求来操作在 中定义的 termio 结构。在 c_lflag 字段中,清除 ICANON(可能还有 ECHO)位。此外,将 c_cc[VMIN] 设置为 1,将 c_cc[VTIME] 设置为 0。
  • 在任何提供 POSIX 兼容性的操作系统(Unix 或其他)下,使用文件描述符 0 上的 tcgetattr 和 tcsetattr 调用来操作在 中定义的 termios 结构。在 c_lflag 字段中,清除 ICANON(可能还有 ECHO)位。此外,将 c_cc[VMIN] 设置为 1,将 c_cc[VTIME] 设置为 0。
  • 紧要关头,在 Unix 下,使用 system(参见 question 19.27)调用 stty 命令来设置终端驱动程序模式(如前三项)。
  • 在 MS-DOS 下,使用 getch 或 getche,或相应的 BIOS 中断。
  • 在 VMS 下,尝试屏幕管理 (SMG$) 例程或诅咒,或使用 IO$_READVBLK 功能代码(可能还有 IO$M_NOECHO 和其他)发出低级 $QIO,以请求一个字符时间。 (也可以在 VMS 终端驱动程序中设置一次字符或“通过”模式。)
  • 在其他操作系统下,您只能靠自己。

【讨论】:

    【解决方案2】:

    对此没有标准功能。

    有一些自定义解决方案,例如https://www.cs.uleth.ca/~holzmann/C/system/ttyraw.c 但你的里程可能会有所不同。

    但是,如果这种终端的动态使用是您程序的核心,我建议您使用 ncurses 或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多