2014-07-04 71 views
0

這裏正確的值是我的代碼:無法獲取箭頭鍵

#include <iostream> 
#include <conio.h> 
#include <vector> 
#include <string> 

using namespace std; 

int startMenu(vector<string> arr, int pos){ 

    /* Keyboard 

    up : char(72) 
    down : char(80) 
    left : char(75) 
    right : char(77) 

    */ 

    char userChar; 

refresh: 

    system("cls"); 

    for (int i = 0; i < arr.size(); i++){ 
     if (i == pos){ 
      cout << "> " << arr[i] << endl; 
     } 
     else{ 
      cout << " " << arr[i] << endl; 
     } 
    } 

    userChar = _getch(); 

    switch (userChar){ 
    case 0: 
    case 0xE0: 
     break; 
    case 72: 
    case 75: 
     --pos; 
     break; 
    case 80: 
    case 77: 
     ++pos; 
     break; 
    case 13: 
     return pos; 
    default: 
     break; 
    } 

    cout << pos << endl; 

    if (pos >= arr.size()){ 
     pos = 0; 
    } 

    if (pos == -1){ 
     pos = arr.size() - 1; 
     cout << "arr.size() - 1 = " << arr.size() - 1 << endl; 
    } 

    goto refresh; 
} 

int main(){ 
    vector<string> arr; 
    arr.push_back("Jamie"); 
    arr.push_back("Alex"); 

    startMenu(arr, 0); 
} 

pos是0,我按上/左鍵,pos應更改爲1(因爲arr.size() - 1),然而, pos被讀爲0(因爲箭頭鍵返回'特殊'值)。

當pos爲0時,如何在按左/上方向鍵後讀取-1而不是0

+0

首先你說過,當你按下/離開時,pos應該是1,然後最後你實際上是-1。這是一個錯誤嗎?你能更清楚地知道你真正想做什麼嗎? –

回答

1

你也許看到一個符號/無符號不匹配在這條線警告,當你編譯:

if (pos >= arr.size()) 

什麼該警告是告訴你的是,在表達式的值,在這種情況下arr.size之一( )是無符號的,另一個pos是有符號的。這意味着爲了比較它們,pos會首先轉換爲無符號值。這意味着,而不是-1它將是一個非常大的值,肯定大於菜單中的行數,比較結果爲true,pos將設置爲0.

修復的最小修改將會是行改成這樣:

if(pos >= static_cast<int>(arr.size())) 

這迫使arr.size()是作爲POS因此它們的值可以直接比較和解決您的問題的類型相同。它也擺脫了警告。

您應該看到一些其他警告,因爲它返回一個int並且您將它存儲在一個int中,因此for循環中的另一個有符號/無符號不匹配會顯示菜單,並且會從_getch()焦炭。在這個程序中都不應該引起問題,但是你應該總是檢查並糾正它們以避免問題。

另一個潛在的問題是,丟棄擴展鍵值0或0xE0意味着您無法確定鍵是否真的是一個箭頭鍵或您正在檢查的ASCII值的實際鍵。作爲一個例子,輸入H也會從_getch()返回72。

我不會試着說出來,但在我看來,你應該避免它。