在接下来的代码中:
#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/