c++ - 无法获得箭头键的正确值

标签 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

最佳答案

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

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。

我不会试图说服您不要使用 goto,但我认为您应该避免使用它。

关于c++ - 无法获得箭头键的正确值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24569686/

相关文章:

c++ - 如何用 QtConcurrent 替换 Qthread

c++ - 用于 Objective C 的 IDE

c++ - 在 C++ 中编译模板结构

c++ - 为 MinGW 配置 Eclipse

c++ - 循环链表

c++ - 如何选择合适的倍数?

c++ - Visual Studio 2015 自动包含缺少的包含

c++ - 读取位图文件

c++ - 创建模板参数的默认值变量

c++ - vector push_back a moved local var in c++11 测试和混淆