2017-05-27 18 views
1

我有GLFWkey_callback()我試圖檢測是否按字母字符。我使用這個功能isalpha()。我注意到,某些鍵如Shift和Alt如字母字符,如果我執行以下處理的代碼:當安全使用`isalpha()`

#include <iostream>                                               

int main() 
{ 
    // 340: printed int if the Shift key is pressed. 
    if(isalpha(340)) 
     std::cout << "alpha"  << std::endl; 
    else 
     std::cout << "not alpha" << std::endl; 

    return 0; 
} 

前面的代碼收率alpha。我可以驗證傳遞給函數的整數範圍,但這沒有意義,因爲我沒有利用函數。 我的問題是否可以將任何整數傳遞給該函數並使用簡單的if語句驗證字母字符?在使用此功能的情況下,需要採取何種預防措施?

+4

我不明白你的代碼中的評論。你從哪裏得到這個魔法340? –

+13

*行爲是不確定的,如果ch的值不能表示爲unsigned char或不等於EOF。*這是不確定的行爲,你是誘導。 – t0mm13b

+0

@ t0mm13b它說,但它實際上是不確定的?在這種情況下這將是340%256 == 84,即t內顯然是字母 –

回答

2

key_callback不是C++的標準部分,所以我搜索並假設你所說的那個是GLFW庫的一部分。在該庫中,key_callback給出了鍵盤掃描碼。

掃描碼不是字符。在典型的輸入模型中,有一個狀態機將掃描碼(以及掃描碼的序列和組合)映射到字符。這是允許您更改QWERTY鍵盤以使其像Dvorak鍵盤一樣工作的層,或者是用於鍵入另一種語言的設計。這key_callback是較低的級別,並將映射留給你。

的C++ std::isalpha函數採用一個char強制轉換爲int或特殊標記值EOF,這通常是-1。 (在某些系統上,您會發現在將其轉換爲int之前,您需要先將char轉換爲unsigned char。)掃描碼不是字符,因此將掃描碼傳遞給std::isalpha毫無意義。

特別值340超出了unsigned char的範圍,它不是EOF,所以它真的不能做任何明智的事情。

如果你需要字符,你將不得不建立自己的從掃描碼(和掃描碼組合)到字符的映射。它看起來像庫爲掃描碼定義了常量。例如,GLFW_KEY_LEFT_SHIFT是340.這應該有所幫助。如果您只需要知道是否按下或釋放了某個特定的鍵,則可以將掃描碼與適當的常量進行比較。

注意:您所標記的問題C++,但您鏈接到爲isalpha C版本的文檔。

+0

充分的細節。謝謝。 – CroCo

1

只是將評論中的討論中的智慧總結爲一個簡短的答案。

  1. 由於在評論中討論的原因,您的代碼有undefined behaviour(UB)。
  2. 因此,結果是不可預測的,很可能是不正確的。
  3. 儘可能避免使用UB代碼。

你不明白你的意思是safe。這不太可能會立即導致災難,但是UB在一些重要的代碼(例如控制飛機的程序)中可以做到。