Функция для чтения ключа без ожидания LF

Я ищу по всему интернету поиски какой-нибудь функции, которая будет читать клавишу с клавиатуры, не дожидаясь LF (например, getch() из conio.h). К сожалению, я должен скомпилировать его с помощью gcc, используя ключи -ansi и -pedantic, что делает getch() бесполезным для меня. Может быть, вы знаете какую-то другую функцию, которая будет соответствовать стандартам?

1 ответ

Решение

Вы можете использовать стандарт 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;
}
Другие вопросы по тегам