c - 无需等待 LF 即可读取按键的功能

标签 c io ansi-c gcc-pedantic

我正在整个互联网上寻找一些可以从键盘读取按键而无需等待 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/

相关文章:

C 参数定义问题

c - 将 void * 缓冲区用作 char * 以外的任何缓冲区是否合法?

c - ANSI C : isprint() returns true for non-ASCII character?

c - 在 C89 中,如何将 double 浮点截断并拆分为两个 32 位字?

c - 在 C 中从 stdin 读取写入到 stdout

c - 在 yacc 中解析赋值语句时出现语法错误

java - 为什么apk的大小这么小?

docker - 如何通过 Go SDK 流式传输 Docker 容器日志

python - 为什么 .readlines() 会生成单个字符的列表?