Функция для чтения ключа без ожидания 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;
}