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.
我正在尝试使用 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. Thenocbreak
routine returns the terminal to normal (cooked) mode.