在接下来的代码中:

#include <stdio.h>

int main(void) {
  int c;
  while ((c=getchar())!= EOF)
    putchar(c);
  return 0;
}

我必须按 Enter 才能打印我用 getchar 输入的所有字母,但我不想这样做,我想要做的是按字母并立即看到我介绍的字母重复而不按 Enter。例如,如果我按下字母“a”,我想在它旁边看到另一个“a”,依此类推:
aabbccddeeff.....

但是当我按“a”时什么也没有发生,我可以写其他字母并且只有当我按 Enter 时才会出现副本:
abcdef
abcdef

我怎样才能做到这一点?

我在Ubuntu下使用命令cc -o example example.c进行编译。

最佳答案

在 linux 系统上,您可以使用 stty 命令修改终端行为。默认情况下,终端将缓冲所有信息,直到按下 Enter 键,甚至在将其发送到 C 程序之前。

一个快速、肮脏且不是特别便携的示例,用于从程序本身内部更改行为:

#include<stdio.h>
#include<stdlib.h>

int main(void){
  int c;
  /* use system call to make terminal send all keystrokes directly to stdin */
  system ("/bin/stty raw");
  while((c=getchar())!= '.') {
    /* type a period to break out of the loop, since CTRL-D won't work raw */
    putchar(c);
  }
  /* use system call to set terminal behaviour to more normal behaviour */
  system ("/bin/stty cooked");
  return 0;
}

请注意,这并不是最佳选择,因为它只是假设 stty cooked 是程序退出时您想要的行为,而不是检查原始终端设置是什么。此外,由于在原始模式下会跳过所有特殊处理,因此许多键序列(例如 CTRL-C 或 CTRL-D)实际上不会像您期望的那样工作,而无需在程序中显式处理它们。

您可以 man stty 以更好地控制终端行为,具体取决于您想要实现的目标。

关于c - 如何避免使用 getchar() 按 Enter 仅读取单个字符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1798511/

10-16 06:07