为什么在这种情况下,printw显示“Blah”?我使用nocbreak。因此printw不应该正常产生输出,因为输出是行缓冲的。

int main(int ac, char **av)
{
    initscr();
    nocbreak();
    printw("Blah");
    refresh();
    while (1);
}

最佳答案

这是因为调用了refresh
refresh man page没有显式地声明它,但它似乎也应用了缓冲输出。
如果不调用refresh,则不会显示输出。
如果将调用添加到getch而不是refresh,则也会得到输出,因为getch执行wrefreshMan page
如果窗口不是便笺簿,并且自上次调用wrefresh以来它已被移动或修改,则在读取另一个字符之前将调用wrefresh。
要查看cbreak/nocbreak模式下输入的不同行为,可以使用以下程序:

int main(int ac, char **av)
{
    char c, i;
    initscr();
    noecho();  // switch off display of typed characters by the tty

    printw("cbreak\n");
    cbreak();
    for (i = 0; i < 5; ++i) {
        c = getch();
        printw("%c", c);
    }

    printw("\nnocbreak\n");
    nocbreak();
    for (i = 0; i < 5; ++i) {
        c = getch();
        printw("%c", c);
    }

    return 0;
}

在cbreak模式下,当您键入五个输入字符时,程序会看到它们(由于getch,因此会立即输出)。在nocbrake模式下,只有按return键才能接收和输出它们。

09-05 18:49