好的,我在下面使用的代码工作得很好,除了打印出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很烦人。
答案 0 :(得分:1)
这一行
while((c=getchar())!=27)
正在使用标准I / O输入功能getchar
。相应的 curses 函数为getch
。
此外,ncurses手册页Initialization部分说明:
获取一次一次的字符输入而不回显(大多数情况下) 交互式,面向屏幕的程序需要这个),应该使用以下序列:
回车 将光标移动到左侧窗口 当前行的保证金。
该问题将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
停止该计划。)