NCURSES printw 获取 RETURN 和 SPACE 键码的正确输出
NCURSES printw Getting correct output of keycodes for RETURN and SPACE
好的,除了打印出键 RETURN 和 SPACE 的正确信息外,我在下面使用的代码工作得很好。
我尝试了很多方法,但这个似乎是最接近的。
更新: 根据 Thomas Dickey 的建议,
#include <ncurses.h>
int main()
{
initscr();
cbreak(); /* as per recommend Thomas Dickey */
noecho(); /* as per recommend Thomas Dickey */
int c, SPACE=32, RETURN=10; /* i know this is wrong but..? */
/* with changes return key is 10 , yet name for keys SPACE && RETURN
do not display, which is the gist of my question.
What am i missing? */
printw("Write something (ESC to escape): ");
move(2,0);
while((c=getch())!=27)
{
//move(2,0);
printw("Keycode: %d, and the character: %c\n", c, c);
refresh();
}
endwin();
return 0;
}
这是终端输出:更新后,
Write something (ESC to escape):
Keycode: 32, and the character: <--spacebar,- no label
Keycode: 10, and the character: <--enter/return key - no label
Keycode: 121, and the character: y
Keycode: 97, and the character: a
Keycode: 109, and the character: m
Keycode: 115, and the character: s
我还是不知所措.... xD.
我正在关注来自 youtube 用户 thecplusplusguy 的 this tutorial,尽管它实际上不是 C++。
明确地说,上面的输出是我想要的,但空格键和 return 键的 "missing" 标签除外。
谢谢。
这一切都导致基于终端的 reader 项目 gutenberg 发布。我需要做一些新的事情。 Android 很烦人。
这一行
while((c=getchar())!=27)
正在使用标准 I/O 输入函数 getchar
. The corresponding curses function is getch
。
此外,ncurses 手册页 Initialization 部分注释:
To get character-at-a-time input without echoing (most
interactive, screen oriented programs want this), the following sequence should be used:
printw function ultimately uses addch,其中(参见手册页):
Carriage return moves the cursor to the window left
margin on the current line.
问题将 RETURN
称为“31”,但没有解释原因。给定的示例似乎显示 OP 在读取输入行之前输入了其他文本。
引用的教程缺少在 single-character 模式下对 运行 的初始化。
如果没有此答案中建议的修复,OP 的程序将无法运行。
OP 对如何渲染 space 和 return 感兴趣示例程序。如果不进行特殊处理,这些字符将呈现为没有任何明显的文本:space 将是空白。通过将 printw 调用更改为如下内容,您可以更好地看到这一点:
printw("Keycode: %d, and the character: \"%c\"\n", c, c);
return是不同的问题。首先,它通常从 ASCII controlM (^M
) 转换为 "newline"(实际上是 ASCII ^J
).对于 大多数 个字符,curses 函数 keyname
(return 是一个指向字符串的指针)以可打印形式显示这些字符。所以你可以改用这个调用:
printw("Keycode: %d, and the character: \"%s\"\n", c, keyname(c));
生成的程序将向您显示 return 被读作 ^J
。如果您希望它是 ^M
,您可以调用 raw()
而不是 cbreak()
(但是您无法使用 ^C
停止程序)。
好的,除了打印出键 RETURN 和 SPACE 的正确信息外,我在下面使用的代码工作得很好。 我尝试了很多方法,但这个似乎是最接近的。
更新: 根据 Thomas Dickey 的建议,
#include <ncurses.h>
int main()
{
initscr();
cbreak(); /* as per recommend Thomas Dickey */
noecho(); /* as per recommend Thomas Dickey */
int c, SPACE=32, RETURN=10; /* i know this is wrong but..? */
/* with changes return key is 10 , yet name for keys SPACE && RETURN
do not display, which is the gist of my question.
What am i missing? */
printw("Write something (ESC to escape): ");
move(2,0);
while((c=getch())!=27)
{
//move(2,0);
printw("Keycode: %d, and the character: %c\n", c, c);
refresh();
}
endwin();
return 0;
}
这是终端输出:更新后,
Write something (ESC to escape):
Keycode: 32, and the character: <--spacebar,- no label
Keycode: 10, and the character: <--enter/return key - no label
Keycode: 121, and the character: y
Keycode: 97, and the character: a
Keycode: 109, and the character: m
Keycode: 115, and the character: s
我还是不知所措.... xD.
我正在关注来自 youtube 用户 thecplusplusguy 的 this tutorial,尽管它实际上不是 C++。
明确地说,上面的输出是我想要的,但空格键和 return 键的 "missing" 标签除外。
谢谢。
这一切都导致基于终端的 reader 项目 gutenberg 发布。我需要做一些新的事情。 Android 很烦人。
这一行
while((c=getchar())!=27)
正在使用标准 I/O 输入函数 getchar
. The corresponding curses function is getch
。
此外,ncurses 手册页 Initialization 部分注释:
To get character-at-a-time input without echoing (most interactive, screen oriented programs want this), the following sequence should be used:
printw function ultimately uses addch,其中(参见手册页):
Carriage return moves the cursor to the window left margin on the current line.
问题将 RETURN
称为“31”,但没有解释原因。给定的示例似乎显示 OP 在读取输入行之前输入了其他文本。
引用的教程缺少在 single-character 模式下对 运行 的初始化。
如果没有此答案中建议的修复,OP 的程序将无法运行。
OP 对如何渲染 space 和 return 感兴趣示例程序。如果不进行特殊处理,这些字符将呈现为没有任何明显的文本:space 将是空白。通过将 printw 调用更改为如下内容,您可以更好地看到这一点:
printw("Keycode: %d, and the character: \"%c\"\n", c, c);
return是不同的问题。首先,它通常从 ASCII controlM (^M
) 转换为 "newline"(实际上是 ASCII ^J
).对于 大多数 个字符,curses 函数 keyname
(return 是一个指向字符串的指针)以可打印形式显示这些字符。所以你可以改用这个调用:
printw("Keycode: %d, and the character: \"%s\"\n", c, keyname(c));
生成的程序将向您显示 return 被读作 ^J
。如果您希望它是 ^M
,您可以调用 raw()
而不是 cbreak()
(但是您无法使用 ^C
停止程序)。