11

我的主要目的是在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方法不起作用

4

2 回答 2

21

终端驱动程序在您点击返回之前不会返回任何内容,即使该read()操作会接受已经存在的内容。

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

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

于 2012-04-20T14:15:39.890 回答
1

如果您在 Linux 或其他类 Unix 系统下尝试此操作,则终端会缓冲输入并仅传递整行。您可以使用 ncurses 来规避这一点:

#include <ncurses.h>

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

    return 0;
}

编译:

gcc -o main main.c -lncurses
于 2012-04-20T14:24:29.737 回答