2014-07-04 72 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。

我不会试着说出来,但在我看来,你应该避免它。