无法获得箭头键的正确值

Unable to get the correct value for the arrow keys

本文关键字:      更新时间:2023-10-16

下面是我的代码:

#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(因为箭头键返回"特殊"值)。

我怎么能读-1而不是0后按左/上箭头键时,pos为0?

在编译时,您可能在这一行看到了有符号/无符号不匹配警告:

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。

我不想劝你不要去,但我认为你应该避免去。

相关文章:
  • 没有找到相关文章