这个开关发生了什么? (C ++滚动菜单)

时间:2017-01-03 19:20:45

标签: c++ scroll menu

这是我的代码。当我按下右键(向上箭头或向下箭头)时,为什么会达到默认情况。当我运行它并按下向上箭头时,它达到默认情况,然后如果我再次按下该键,则到达正确的情况并工作。为什么会这样?

#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;
}

1 个答案:

答案 0 :(得分:4)

#define KEY_UP 72

        switch((c=getch()))
        {
            case KEY_UP:

72是大写 H 字符的ASCII。

按下键盘上的光标键极不可能输入字母 H

实际的解释是光标移动按键生成一个多字符代码,很可能是一个跟随一个或两个字符的 Esc 代码,最后一个代码是 H

在我的终端上,例如,向上光标生成 ESC [A 字符序列。

您的for循环一次只能读取一个字符。因此,当它读取 Esc 时,它会由default代码路径处理。并且,在下一次阅读时,(或下一个),H被读取,这是您看到的结果。