2012-12-31 98 views
2

我正在做一個C程序與Linux上的ncurses庫。奇怪的鍵值由ncurses打印

我決定檢查我與的getch()函數,更具體地,退格鍵接收到的輸入。

退格 ASCII十進制值爲,鏈接:here 我決定打印我按下的鍵的數字的十進制值,例如:

一個 - > 97

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

注:改變原始()CBREAK()產生相同的輸出

輸出測試:(注:I型: 'A', 'A',(退格鍵),(SUPR), 'J')

Type: 
> 97a65A7^G74J74J 

我不明白爲什麼會發生這種情況,有人可以解釋爲什麼Backspace鍵輸出7而不是127,Supr輸出74,這是相同的SA'J'?

+2

74'j'和BELL –

+2

我覺得我們需要看代碼...並且可以通過termios中的設置將退格映射爲「刪除」(127)。 –

+0

值得注意的是,你可能需要做'鍵盤(stdscr,TRUE);'以允許「特殊」鍵通過。不知道這是什麼問題在這裏。 「常規」以外的鍵也在範圍之外或「字符」,這可能會影響事物。 –

回答

5

對於特殊功能鍵,getch()不一定返回ASCII字符,它返回<curses.h>中的KEY_xxx代碼之一。在退格的情況下,這是:

#define KEY_BACKSPACE 0407  /* backspace key */ 

既然你聲明ch作爲char而非int,價值0407被截斷爲07

更改聲明:

int ch; 

,然後它會顯示263當你按下退格鍵。但是,addch()仍然會顯示^G,因爲它不使用KEY_xxx宏。您需要在代碼中處理這些字符。

+0

感謝您的回答:) – Kosmos

0

我相信「特殊」鍵正在生成多字符讀數,這解釋了輸出中的^。

有關更多信息,請參閱caret notation

+0

退格返回7^G,這不是它的插入符號符號。 – asheeshr

+0

你是對的,出於某種原因退格輸出7和^ G,但仍然,爲什麼它輸出7?根據你的鏈接應該是'^?' – Kosmos