2

我正在整个互联网上寻找一些可以从键盘读取键而无需等待 LF 的功能(例如 conio.h 中的 getch() )。不幸的是,我必须使用开关 -ansi 和 -pedantic 使用 gcc 编译它,这使得 getch() 对我来说毫无用处。也许您知道其他符合标准的功能?

4

1 回答 1

2

您可以使用标准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;
}
于 2012-10-16T19:55:50.697 回答