setvbuf no puede hacer stdin sin búfer

Mi principal intención era hacer que getchar volviera tan pronto como getchar un carácter en lugar de esperar la tecla ENTER . Intenté esto

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

Comparando esto con el prototipo de setvbuf

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

debe establecer stdin en el modo sin búfer.

Pero aún getchar() sigue esperando ENTER

He visto publicaciones relacionadas como esta

Imprimir mientras lee caracteres en C

que sugieren métodos alternativos para hacer stdin sin búfer. Pero tengo curiosidad por saber por qué el método setvbuf no funciona

El controlador del terminal no devuelve nada hasta que toca return, incluso si la operación read() aceptaría lo que ya está allí.

Para obtener entrada de carácter por carácter desde un terminal, debes salir del modo canónico al modo raw o cbreak, y eso requiere diferentes operaciones por completo. Eche un vistazo al manual de POSIX en ‘Interfaz de terminal general’ para saber cómo controlar el terminal. O considere usar la biblioteca de curses .

Ver también: entrada terminal canónica frente a no canónica

En caso de que intente esto en Linux u otro sistema parecido a Unix, es el terminal el que almacena la entrada y solo pasa una línea completa. Puede usar ncurses para eludir esto:

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

Comstackr con:

 gcc -o main main.c -lncurses