2014-01-23 60 views
1

程序爲何不返回任何ASCII值當我按下按鍵「F1 - F12, Delete, Caps Lock, Num Lock是沒有ASCII有鍵的值

#include<stdio.h> 

int main() 
{ 
char a; 
clrscr(); 
a= getche(); 

printf("\n a= %c ASCII = %d ASCII = %hhu",a,a,a); 
// used hhu as it was told in SO it helps to print ASCII 

getch(); 
return 0; 
} 

它返回的值0。爲什麼這樣?當按下Num Lock和Caps Lock時,它不會採取任何行動。 (注意:我沒有測試所有的鍵) 如果有任何錯誤,請更正程序。我用Turbo C++編寫程序。

謝謝

+0

的[殘培和箭頭碼(http://stackoverflow.com/questions/10463201/getch-and-arrow-codes) – xxbbcc

+0

@xxbbcc有關於鑰匙隻字不提我要求可能重複。 – MELWIN

+0

你能提供編譯器命令行嗎?運行'gcc'會給我三個未定義的引用。 – merlin2011

回答

4

ASCII原本是基於英文字母編碼128個指定的字符一個字符編碼方案。所以是的,許多鍵盤上都有很多沒有ASCII碼的鍵。

你指的是更接近scancode。一些鍵,例如功能鍵,具有沒有可打印表示的掃描碼,即。該代碼不屬於[0-127]。功能鍵的解釋方式在很大程度上取決於您的環境,例如您的終端仿真程序是否在VT100模式下運行。

+0

但是ESc,退格輸入等等也包含ascii值,而當我按下這些時顯示值也爲... – MELWIN

+2

當按下功能鍵時,可能會生成控制序列,很可能以ESC字符開頭,或者可能會以不同的方式處理。棘手的領域,但有很多不是ASCII的密鑰。例如,省略號...在這裏輸入,但不是ASCII碼。 Ditto™等等。當我按住'fn'(功能)鍵並按下F1鍵時,會生成ESC O P。如果我沒有按下功能鍵,屏幕會調暗一個檔位。這取決於硬件和O/S。 –

1

按鍵會發生什麼取決於您的終端類型/操作系統。出現這種情況一般的事情如下:

鍵盤 - >某種中斷掛鉤(操作系統的一部分) 的 - >改變擊鍵的ASCII字符 - >提供結果給你的程序。例如,'A'的ASCII字符是65'a'97。但是,鍵盤上的物理鍵是一樣的。 ASCII字符是操作系統解釋按下的序列/鍵組的方式的結果。

對於訪問被按下的按鍵,您將不得不做一些低級編程。不用說,這將是操作系統特定的。

+0

那麼告訴我如何顯示他們的ascii值... – MELWIN

2

它確實取決於你的標準lib(很可能來自你的編譯器)。因此,您將從操作系統到操作系統以及編譯器到編譯器。

您的標準庫需要OS調用來讀取密鑰。然後它將從OS返回的值轉換爲從C stdin返回的值。有些映射像A-Z一樣簡單,但其他的如F1-F12,頁面上/下和ALT鍵不是。

有幾件事情,大多數人都同意:

  • AZ地圖爲ASCII 65-90
  • AZ地圖爲ASCII 97-122
  • 0-9映射爲ASCII 48-57
  • 將標準標點符號映射到ASCII所在的位置(。,「!等)
  • 控制AZ地圖以ASCII控制代碼1-26
  • 返回/輸入映射到ASCII 13
  • ESC映射到ASCII 27
  • TAB映射到ASCII 9

大多數時候它們同意這些還有:

  • Backspace鍵映射到ASCII 8
  • 刪除映射到ASCII 127

這就是爲什麼你有時會得到一些鍵的值,但不是全部。

根據你的函數調用getche()和你的tag turboC++,我懷疑你正在使用Turbo C++。 Turbo C++使用舊的DOS方法(就像GWBasic和DOS時代的許多其他程序一樣)。

在DOS方法中,您將得到一個0,然後是第二個被按下的鍵。所以你會閱讀標準輸入,如果它是0再次讀取標準輸入,然後處理該代碼作爲在switch語句中按下的鍵。

例如,左箭頭是「\ 0」,後面跟着「K」。

這裏有一些使用DOS方法的常用鍵。

a=getche(); 
if(a==0) 
{ 
    a=getche(); 
    switch(a) 
    { 
     case 'H': printf("Up arrow\n");break; 
     case 'P': printf("Down arrow\n";break; 
     case 'K': printf("Left arrow\n";break; 
     case 'M': printf("Right arrow\n";break; 
     case ';': printf("F1\n";break; 
     case '<': printf("F2\n";break; 
     case '=': printf("F3\n";break; 
     case '>': printf("F4\n";break; 
     case '?': printf("F5\n";break; 
     case '@': printf("F6\n";break; 
     case 'A': printf("F7\n";break; 
     case 'B': printf("F8\n";break; 
     case 'C': printf("F9\n";break; 
     case 'D': printf("F10\n";break; 
     case 133: printf("F11\n";break; 
     case 134: printf("F12\n";break; 
     case 'R': printf("Ins\n";break; 
     case 'S': printf("Del\n";break; 
     case 'G': printf("Home\n";break; 
     case 'O': printf("End\n";break; 
     case 'I': printf("PgUp\n";break; 
     case 'Q': printf("PgDn\n";break; 
     default: 
     printf("Unknown\n"); 
    } 
}