由ncurses打印的奇怪键值

时间:2012-12-31 15:27:10

标签: c linux keyboard ascii curses

我正在使用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'?

2 个答案:

答案 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