无法获得箭头键的正确值

时间:2014-07-04 08:16:32

标签: c++

这是我的代码:

#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

1 个答案:

答案 0 :(得分:1)

编译时,您可能在此行上看​​到了签名/未签名的不匹配警告:

if (pos >= arr.size())

警告告诉你的是表达式中的一个值,在本例中是arr.size()是无符号的,另一个是pos符号。这意味着为了比较它们,pos将首先转换为无符号值。这意味着代替-1将是一个非常大的值,当然大于菜单中的行数,比较将为真,pos将设置为0.

要解决的最小修改方法是将行更改为:

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

这会强制arr.size()与pos的类型相同,因此可以直接比较值并解决您的问题。它也摆脱了警告。

你应该看到一些其他警告,for循环中的另一个有符号/无符号不匹配,显示菜单以及从_getch()的int到char警告的转换,因为它返回一个int并且你将它存储在一个char中。也不应该在这个程序中引起问题,但是你应该经常检查并纠正它们以避免问题。

另一个潜在的问题是丢弃扩展键值0或0xE0意味着您无法判断该键是否真的是箭头键或具有您正在检查的ASCII值的实际键。例如,键入H也会从_getch()返回72。

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