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中读取字符时打印

这是build议替代方法使stdin无缓冲。 但我很好奇,知道为什么setvbuf方法不起作用

即使read()操作接受已经存在的内容,terminal驱动程序也不会返回任何内容。

为了从terminal获取逐个字符的input,必须将其从标准模式转换为原始模式或复制模式,并且这需要不同的操作。 查看“通用terminal接口”上的POSIX手册了解如何控制terminal。 或者考虑使用curses库。

另请参见: 规范与非规范terminalinput

如果你正在Linux或者其他类Unix系统中尝试这个,terminal会缓冲input并且只传递整行。 你可以使用ncurses来绕过这个:

 #include <ncurses.h> int main() { initscr(); getch(); endwin(); return 0; } 

编译:

 gcc -o main main.c -lncurses