这是我的代码:
#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/