由ncurses打印的奇怪键值

Kos*_*mos 2 c linux keyboard curses ascii

我正在使用Linux上的ncurses库在C中做一个小程序.

我决定用getch()函数检查我收到的输入,更具体地说是退格键.

退格 ASCII十进制值是127,链接:在这里 ,我决定我打印按下,例如按键的数字十进制值:

a - > 97

A - > 65

] - > 93 ......

后者是正确的.

但是,以下值正确:

退格 - > 7(这是BELL)

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;
}
Run Code Online (Sandbox Code Playgroud)

注意:raw()更改为cbreak()会生成相同的输出

输出测试:(注意:我输入:'a','A',(Backspace),(Supr),'J')

Type:
> 97a65A7^G74J74J
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样,有人可以解释为什么Backspace键输出7而不是127,而Supr输出74,这是相同的sa'J'?

Bar*_*mar 5

对于特殊功能键,getch()不一定返回ASCII字符,它返回其中一个KEY_xxx代码<curses.h>.在Backspace的情况下,这是:

#define KEY_BACKSPACE   0407        /* backspace key */
Run Code Online (Sandbox Code Playgroud)

由于您声明chchar而不是int,该值0407被截断为07.

将声明更改为:

int ch;
Run Code Online (Sandbox Code Playgroud)

然后263在按Backspace时显示. 但addch()仍然会显示^G,因为它不使用KEY_xxx宏.您需要在代码中处理这些字符.