【问题标题】:NCURSES printw Getting correct output of keycodes for RETURN and SPACENCURSES printw 为 RETURN 和 SPACE 获取正确的键码输出
【发布时间】:2016-01-01 03:19:20
【问题描述】:

好的,我在下面使用的代码效果很好,除了打印出键 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++。

要清楚,上面的输出是我想要的,除了空格键和返回键的“缺失”标签。

谢谢。

这一切都导致了一个基于终端的阅读器,用于项目古腾堡版本。我需要做一些新的事情。 Android 很烦人。

【问题讨论】:

    标签: c constants ncurses


    【解决方案1】:

    这一行

    while((c=getchar())!=27)
    

    正在使用标准 I/O 输入函数getchar。对应的curses函数是getch

    此外,ncurses 手册页Initialization 部分注释:

    在不回显的情况下获取一次字符的输入(大多数 交互式、面向屏幕的程序需要这个),应使用以下顺序:

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

    printw 函数最终使用addch,它(参见手册页):

    回车将光标移到窗口左侧 当前行的边距。

    问题将RETURN 称为“31”,但没有解释原因。给定的示例似乎显示 OP 在读取输入行之前输入其他文本。

    引用的教程缺少在单字符模式下运行的初始化。

    如果没有此答案中的建议修复,OP 的程序将无法运行。

    OP 对如何渲染 spacereturn 感兴趣,以便在示例程序中显示某些内容。如果不进行特殊处理,这些字符将被渲染而没有任何明显的文本:space 将是空白。您可以通过将 printw 调用更改为以下内容来更好地看到这一点:

    printw("Keycode: %d, and the character: \"%c\"\n", c, c);
    

    return 是一个不同的问题。首先,它通常从 ASCII controlM (^M) 转换为“换行符”(实际上是 ASCII ^J)。对于大多数个字符,curses 函数keyname(它返回一个指向字符串的指针)以可打印的形式显示这些字符。所以你可以改用这个调用:

    printw("Keycode: %d, and the character: \"%s\"\n", c, keyname(c));
    

    生成的程序将显示 return 被读取为^J。如果你希望它是^M,你可以调用raw()而不是cbreak()(但是你不能使用^C来停止程序)。

    【讨论】:

    • while((c=getchar())!=27) 涵盖退出键序列。 getch 似乎很紧张,所以我使用了 gethcar。本教程中的程序显然按照预期工作,除了为空格和返回键添加标签。虽然我很欣赏您的意见,但这是一个非回答。
    • 我已经用你的建议更新了我的问题,但我仍然没有得到空格键和返回键的任何“标签”输出。我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 2015-03-16
    • 2022-12-03
    • 2012-03-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多