gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:48:06 25 4
gpt4 key购买 nike

这是我的代码:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com