getch() returns 2 个字符

getch() returns 2 characters

我正在尝试使用 getch 从用户那里获取角色。但是它 returns 2 个相同的字符。

#include <ncurses.h>
int main()
{
    initscr();
    char input = getch();
    printw("%c",input);
    getch();
    endwin();
}

有人知道解决这个问题的方法吗?

当您在终端中键入字符时,它会得到回显。您看到的是回显字符和 printw().

的结果

当您使用 ncurses 时,您可以通过调用函数 noecho().

轻松禁用回显

通常的做法是定义自己的函数初始化 curses,例如:

void init_curses()
    if (!initscr()) {
        exit(1);
    }
    noecho();
}

您得到两个字符,因为最初输入处于 缓冲 模式。第二个字符将是换行符。

参考manual page,其中说

To get character-at-a-time input without echoing (most interactive, screen oriented programs want this), the following sequence should be used:
initscr(); cbreak(); noecho();

您的示例可能是这样的:

#include <ncurses.h>
int main()
{
    initscr();
    cbreak(); // puts the terminal into unbuffered mode
    int input = getch();
    printw("%c",input);
    getch();  // actually needed for a different reason...
    endwin();
}

cbreak 的手册页解释了

Normally, the tty driver buffers typed characters until a newline or carriage return is typed. The cbreak routine disables line buffering and erase/kill character-processing (interrupt and flow control characters are unaffected), making characters typed by the user immediately available to the program. The nocbreak routine returns the terminal to normal (cooked) mode.