我正在使用Linux上的ncurses库在C中做一个小程序。
我决定使用 getch()函数检查我收到的输入,更具体地说,退格键。
退格 ASCII十进制值 127 ,链接:here 我决定打印我按下的键的数字十进制值,例如:
a - > 97
A - > 65
] - > 93 ...
后者是正确的。
但是,以下值不正确:
Backspace - > 7(贝尔)
Supr - > 74(即'J')
这是测试代码:
#include <curses.h>
int main(int argc, char **argv)
{
char ch;
int column,line;
int s_column,s_line;
initscr();
clear();
noecho();
raw();
keypad(stdscr,TRUE);
printw("Type: \n> ");
refresh();
getyx(stdscr,s_line,s_column);
while((ch=getch())!='\n')
{
printw("%d",ch);
addch(ch);
refresh();
}
endwin();
return 0;
}
注意:将 raw()更改为 cbreak()会生成相同的输出
输出测试:(注意:我输入:'a','A',(Backspace),(Supr),'J')
Type:
> 97a65A7^G74J74J
我不明白为什么会发生这种情况,有人可以解释为什么Backspace键输出7而不是127,而Supr输出74,这是同一个'J'?
答案 0 :(得分:5)
对于特殊功能键,getch()
不必返回ASCII字符,它会返回KEY_xxx
中的<curses.h>
个代码之一。在Backspace的情况下,这是:
#define KEY_BACKSPACE 0407 /* backspace key */
由于您将ch
声明为char
而不是int
,因此值0407
将被截断为07
。
将声明更改为:
int ch;
然后按Backspace时会显示263
。不过,addch()
仍会显示^G
,因为它不会使用KEY_xxx
宏。您需要在代码中处理这些字符。
答案 1 :(得分:0)
我相信“特殊”键正在生成多字符读数,这解释了输出中的^。
有关详情,请参阅caret notation。