这是我的代码:
#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
?
答案 0 :(得分:1)
编译时,您可能在此行上看到了签名/未签名的不匹配警告:
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。
我不会试着和你说话,但在我看来你应该避免它。