2

Linux で ncurses ライブラリを使用して、C で小さなプログラムを実行しています。

getch()関数で受け取った入力、具体的にはバックスペースキーをチェックすることにしました。

バックスペースASCII 10 進数値は127です。リンク:ここ では、押したキーの 10 進数値を出力することにしました。たとえば、次のようになります。

-> 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;
}

注: raw()cbreak()に変更すると、同じ出力が生成されます

出力テスト: (注: 入力: 'a','A',(Backspace),(Supr),'J')

Type:
> 97a65A7^G74J74J

なぜこれが起こっているのかわかりません.Backspaceキーが127ではなく7を出力し、Suprが74を出力する理由を誰かが説明できますか?これは「J」と同じですか?

4

2 に答える 2

5

特別なファンクション キーの場合、getch()必ずしも ASCII 文字を返すとは限りません。 のKEY_xxxコードのいずれかを返します<curses.h>。バックスペースの場合、これは次のとおりです。

#define KEY_BACKSPACE   0407        /* backspace key */

ではなくと宣言chしているため、値は に切り捨てられています。charint040707

宣言を次のように変更します。

int ch;

263バックスペースを押す と表示されます。ただし、マクロを使用していないため、addch()引き続き表示されます。コードでこれらの文字を処理する必要があります。^GKEY_xxx

于 2012-12-31T16:46:00.020 に答える
0

「特別な」キーが複数文字の読み取りを生成していると思います。これにより、出力の ^ が説明されます。

詳細については、キャレット表記を参照してください。

于 2012-12-31T15:55:07.773 に答える