关于C#:setvbuf无法使stdin无缓冲

setvbuf not able to make stdin unbuffered

我的主要目的是使getchar在获取字符后立即返回,而不是等待ENTER键。 我试过了

1
2
3
4
5
6
7
int main()
{
    setvbuf(stdin,NULL,_IONBF,0);
    getchar();

    return 0;
}

setvbuf的原型进行比较

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

应该将stdin设置为非缓冲模式。

但是getchar()仍然在等待ENTER

我看过这样的相关文章

读取C中的字符时进行打印

这建议使用其他方法使stdin不受缓冲。 但是我很想知道为什么setvbuf方法不起作用


终端驱动程序直到您按回车键才返回任何内容,即使read()操作将接受已经存在的内容。

要从终端获取逐个字符的输入,您必须将其从规范模式转换为原始模式或cbreak模式,并且这完全需要不同的操作。 查看有关"通用终端接口"的POSIX手册,了解如何控制终端。 或者考虑使用curses库。

另请参阅:规范与非规范终端输入


如果您要在Linux或其他类似Unix的系统上尝试此操作,则终端将缓冲输入并仅传递整行。 您可以使用ncurses规避此问题:

1
2
3
4
5
6
7
8
9
10
#include <ncurses.h>

int main()
{
    initscr();
    getch();
    endwin();

    return 0;
}

编译:

1
gcc -o main main.c -lncurses