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:

initscr(); cbreak(); noecho();

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 对如何渲染 spacereturn 感兴趣示例程序。如果不进行特殊处理,这些字符将呈现为没有任何明显的文本: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 停止程序)。