getch 函式的使用方法及其返回值問題

2022-09-07 08:03:06 字數 1516 閱讀 6740

getch()函式依賴於標頭檔案conio.h.會在windows平台下從控制台無回顯地取乙個字元,並且返回讀取到的字元。

然而,我在實際用這個函式才發現getch()這個函式並不簡單。

getch函式從控制台讀取單個字元而不回顯,函式不能去讀取ctrl+c,當讀取乙個功能鍵或方向鍵,函式必須呼叫兩次(這就說明可以用這個函式去監控功能鍵和方向鍵),第一次呼叫返回0或0xe0,第二次返回實際的鍵**

例如:

#include #include int main()

return 0;

}

在這個簡單的小程式中,我測試了幾個鍵盤的按鍵。

為了**getch()的真相,我改寫了以上函式。

int main()

return 0;

}

在鍵盤上依次輸入上下左右得到如下鍵值:

上下左右方向鍵,getch()第一次返回 224(0xe0),第二次返回真實鍵值

在鍵盤上依次輸入f1~f10、f11、f12、delete得到如下鍵值: 

f1~f10,getch()第一次返回 0 ,第二次返回該鍵的真實鍵值(59~68)

那麼問題就來了,getch()一會返回乙個值,一會返回兩個值,究竟要怎樣寫才不會出錯呢?

我這裡提供一種方法,僅供參考

#include int main()

} else //普通按鍵,如字母、數字、space,esc等按鍵}}

return 0;

}

注意1:在以上**中 tmp 為char型別,可接受的值為 -128~127之間,所以原本 0xe0的返回值(10進製為224) 會被轉換為 -32。

轉換原理為 超出char範圍的(即127以後的數字),把差值從 char型別的另一側極限值重新開始計算(即-128往後排)

例如:224——> 超出97(224-127)——> -128+97-1=-32 

詳見char的越界賦值即其原理剖析

解決辦法:

可以把tmp定義 unsigned char型別

通過計算、或者測試,得到可用的鍵值。

注意2:用getch()函式時,編譯器可能會給出如下錯誤

嚴重性    **    說明    專案    檔案    行    禁止顯示狀態

錯誤    c4996     'getch': the posix name for this item is deprecated. instead, use the iso c and c++ conformant name: _getch. see online help for details.    

解決辦法:把getch()換成編譯器要求的_getch()函式即可 

getch方法 如何實現getch 函式的功能

使用 getch 函式,需要先引入 conio.h 標頭檔案 然而,我使用的是 cygwin 作為編譯環境,找不到 conio.h 所以只能想辦法找替代方法,或者自己構造乙個具有類似功能的函式。可惜,剛學沒多久,一時之間也是沒有想到什麼合適的替代方法,若說自己構造這個函式,這就更難了。原理為 臨時關...

NSDictionary的使用方法及其小例子

nsarray array1 nsarray arraywithobjects iphone ipod nil nsarray array2 nsarray arraywithobjects mac imac mac pro nil 類方法初始化自動釋放 nsdictionary mydiction...

vue的元件及其使用方法

vue作為一款優秀的前端開發框架,在元件方面確實比純粹的html要方便得多。以往在敲前端 的時候,我們不可避免的要在不同的頁面使用同樣的 比如導航欄 側邊欄等。雖然可以在乙個頁面中內建另外的頁面,但是這樣的操作也是相當麻煩,而我經常為了偷懶便直接貼上複製了,而這卻導致了頁面 非常冗長且冗餘嚴重,修改...