C ++ _getch()读取多个值

时间:2016-10-09 16:27:26

标签: c++

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77

int main()
{
    int c = 0;
    while (c != 27)    //esc key code
    {
        c = 0;

        switch (c = _getch()) 
        {
        case KEY_UP:
            cout << endl << "Up" << endl;//key up
            break;
        case KEY_DOWN:
            cout << endl << "Down" << endl;   // key down
            break;
        case KEY_LEFT:
            cout << endl << "Left" << endl;  // key left
            break;
        case KEY_RIGHT:
            cout << endl << "Right" << endl;  // key right
            break;
        default:
            cout << endl << "null" << endl;
            break;
        }

    }
    return 0;
}

输出应为

Up
Down
Left
Right

但我得到的是

null
Up
null
Down
null
Left
null
Right

根据输出,程序将读取其他关键代码,在读取实际的密钥代码之前我不知道它是什么,在此之前我没有cin,为什么?任何解决方案?

2 个答案:

答案 0 :(得分:3)

如果你选择read the fine manual,你会遇到这样的陈述:

  

当读取功能键或箭头键时,每个功能必须被调用两次;第一个调用返回0或0xE0,第二个调用返回实际的键代码。

这就是你怎么知道什么时候72表示向上箭头以及什么时候它是字母H(恰好有一个ASCII码为72)。

答案 1 :(得分:0)

enter image description here

所做的更改:

我从switch语句中删除了default。它导致空打印。

此外,我还添加了kbhit()#define KEY_ESC 27,并将getch()移到了switch语句的旁边。

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_ESC 27

#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>     
using namespace std;

int main()
{

    int c = 0;

    while ( c!= KEY_ESC )    //esc key code is 27
    {
        if (kbhit()) {
            c = getch();

                switch ( c ) 
                {
                case KEY_UP:
                    cout << endl << "Up" << endl;//key up
                    break;
                case KEY_DOWN:
                    cout << endl << "Down" << endl;   // key down
                    break;
                case KEY_LEFT:
                    cout << endl << "Left" << endl;  // key left
                    break;
                case KEY_RIGHT:
                    cout << endl << "Right" << endl;  // key right
                    break;

                }//switch

        }//if

    }//while

    return 0;
}