无法获得箭头键的正确值
Unable to get the correct value for the arrow keys
下面是我的代码:
#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。
我不想劝你不要去,但我认为你应该避免去。
相关文章:
- 没有找到相关文章