setvbuf не может сделать stdin небуферизованным

Мое основное намерение состояло в том, чтобы вернуть getchar как только он получит символ вместо ожидания клавиши ENTER . Я попробовал это

 int main() { setvbuf(stdin,NULL,_IONBF,0); getchar(); return 0; } 

Сравнивая это с прототипом setvbuf

 setvbuf ( FILE * stream, char * buffer, int mode, size_t size ); 

он должен установить stdin в небуферизованный режим.

Но все же getchar() продолжает ждать ENTER

Я видел похожие сообщения, подобные этому

Печать при чтении символов в C

которые предлагают альтернативные методы, чтобы сделать stdin небуферизованным. Но мне любопытно узнать, почему метод setvbuf не работает

Драйвер терминала ничего не возвращает, пока вы не нажмете возврат, даже если операция read() примет то, что уже существует.

Чтобы получить посимвольный ввод от терминала, вы должны вывести его из канонического режима в режим raw или cbreak, и для этого требуются разные операции. Взгляните на руководство POSIX на «Общий интерфейс терминала», как управлять терминалом. Или рассмотрите возможность использования библиотеки curses .

См. Также: Canonical vs non-canonical terminal input

Если вы пытаетесь это сделать под Linux или другой Unix-подобной системой, это терминал, который буферизует ввод и пропускает только целую строку. Вы можете использовать ncurses, чтобы обойти это:

 #include  int main() { initscr(); getch(); endwin(); return 0; } 

Компиляция с:

 gcc -o main main.c -lncurses 
Interesting Posts

Что такое Android PendingIntent?

HTML5 iFrame Бесшовный атрибут

Остановить Opera из доменов автозаполнения

Dell xps m1330: ошибка аппаратного сбоя

Как импортировать и экспортировать компоненты с помощью React + ES6 + webpack?

Как проверить статическую функцию

Использование функции numpy `as_strided` для создания патчей, плиток, скользящих или скользящих окон произвольного размера

Статические ссылки очищаются – действительно ли Android разгружает classы во время выполнения, если они не используются?

конвертировать письма в номера

Антенна с высоким коэффициентом усиления: установите Wi-Fi-маршрутизатор на одну антенну или два

Как сбросить будильник, если приложение закрыто в андроиде

Сделайте так, чтобы Outlook не выбирал первую почту в папке «Входящие»

Как настроить страницу приветствия на действие struts?

Как тренировать / тестировать мой собственный dataset в кафе?

Что такое отладчик и как он может помочь мне диагностировать проблемы?

Давайте будем гением компьютера.