C: ncurses, initscr() 改变了 getchar() 的行为?

C: ncurses, initscr() changes behaviour of getchar()?

我只是在玩 ncurses 等等,我发现了一个非常奇怪的行为。

当我使用 ncurses 库中的 initscr(),然后使用普通的 getchar() 时,程序会在按下第一个键后终止。

我期望的正常 getchar() 行为是,只要我按下 return,我就可以输入(或多或少)。

#include "curses.h"

int main()
{
    initscr();
    getchar();
  //endwin();

    return 0;
}

谁能解释一下为什么会这样?

curses 将终端输入初始化为 raw 模式(这反过来使连接的流就像 unbuffered 一样),所以curses 可以检测单字符输入。 getchar 假定输入已缓冲,因此您可以按 Enter 结束输入行。在 raw 模式下,getchar returns 马上,因为 read 调用会在您按下一个键后立即找到一些东西。

除了endwin之外,您还可以使用其他 curses 函数在终端的 raw/cooked 模式之间切换 back/forth(参见 reset_shell_mode and reset_prog_mode 的手册)。