NCURSES printw获取RETURN和SPACE键码的正确输出

时间:2016-01-01 03:19:21

标签: c const ncurses

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

要清楚,上面的输出就是我想要的,除了&#34;缺少&#34;空格键和返回键的标签。

谢谢。

这一切都导致了基于终端的读者的项目gutenberg发布。我需要做一些新的事情。 Android很烦人。

1 个答案:

答案 0 :(得分:1)

这一行

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

正在使用标准I / O输入功能getchar。相应的 curses 函数为getch

此外,ncurses手册页Initialization部分说明:

  

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

     

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

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

  

回车 将光标移动到左侧窗口   当前行的保证金。

该问题将RETURN称为&#34; 31&#34;,但不解释原因。给定的示例似乎显示OP在读取输入行之前输入其他文本。

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

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

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

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

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

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

生成的程序会显示 return 读为^J。如果您希望它为^M,则可以致电raw()而不是cbreak()(但之后您无法使用^C停止该计划。)