我正在整个互联网上寻找一些可以从键盘读取按键而无需等待 LF 的函数(例如 conio.h 中的 getch() )。不幸的是我必须使用 gcc 使用开关 -ansi 和 -pedantic 来编译它,这使得 getch() 对我来说毫无用处。也许您知道其他一些符合标准的功能?
最佳答案
您可以使用标准的setvbuf
函数来禁用缓冲(请参见下面的示例)。请注意,从程序的角度来看,这将导致禁用缓冲,但不会禁用终端中的缓冲(这也可能是您想要的)。示例代码:
#include <stdio.h>
int main()
{
char c;
setvbuf(stdin, 0, _IONBF, 0);
c = getc(stdin);
printf("read %c\n", c);
return 0;
}
像这样运行它仍然会从终端逐行读取输入,但只消耗输入的第一个字符:
$ ./buf
ab
read a
$ b
删除 setvbuf
行将导致程序消耗整行输入。
如果仅使用 C 标准库,则没有可移植的方法来禁用终端的行缓冲,因为它不了解终端。
编辑:
一种可移植的 POSIX 方法可以实现您想要的功能,即使用 termios 函数:
#include <stdio.h>
#include <unistd.h> /* for STDIN_FILENO */
#include <termios.h>
int main()
{
char c;
struct termios old, t;
tcgetattr(STDIN_FILENO, &old);
t = old;
cfmakeraw(&t);
tcsetattr(STDIN_FILENO, TCSANOW, &t);
c = getc(stdin);
tcsetattr(STDIN_FILENO, TCSANOW, &old);
printf("\rread %c\n", c);
return 0;
}
关于c - 无需等待 LF 即可读取按键的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921701/