这是我的代码。当我按下右键(向上箭头或向下箭头)时,为什么会达到默认情况。当我运行它并按下向上箭头时,它达到默认情况,然后如果我再次按下该键,则到达正确的情况并工作。为什么会这样?
#include <conio.h>
#include <iostream>
#include <windows.h>
using namespace std;
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_RETURN 13
void admin_login()
{
system("cls");
std::string username, password;
/*gotoxy(console::width/2-10,console::height/2-3);*/
std::cout << "\nUsername: ";
std::cin >> username;
std::cout << "\nPassword: ";
std::cin >> password;
}
int main()
{
int c = 0;
int line = 0;
std::string menu_line[] = { "Admin login", "Guest login", "Change color theme", "Exit" };
while(1)
{
system("cls");
for(int i = 0 ; i < 4 ; i++)
{
if(i == line)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
std::cout << menu_line[i] << '\n';
}
switch((c=getch()))
{
case KEY_UP:
--line;
if(line == -1)
line = 3;
break;
case KEY_DOWN:
++line;
if(line == 4)
line = 0;
break;
case KEY_RETURN:
switch(line)
{
case 0:
system("cls");
admin_login();
break;
}
break;
default:
cout << endl << "null" << endl; // not arrow
system("pause");
break;
}
}
return 0;
}
答案 0 :(得分:4)
#define KEY_UP 72
switch((c=getch()))
{
case KEY_UP:
72是大写 H 字符的ASCII。
按下键盘上的光标键极不可能输入字母 H 。
实际的解释是光标移动按键生成一个多字符代码,很可能是一个跟随一个或两个字符的 Esc 代码,最后一个代码是 H
在我的终端上,例如,向上光标生成 ESC [A 字符序列。
您的for
循环一次只能读取一个字符。因此,当它读取 Esc 时,它会由default
代码路径处理。并且,在下一次阅读时,(或下一个),H
被读取,这是您看到的结果。