C _getch() считывает несколько значений

#c

#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 до этого, почему? есть решение?

Комментарии:

1. Вероятно, это n так.

2. И какой закон точно помешал вам напечатать значение ключа чтения в default: разделе, чтобы определить, что еще читается, чтобы выяснить, что происходит?

3. _getch() это не C . Похоже, это какое-то расширение Microsoft.

4. Мне также интересно узнать, что помешало вам просто прочитать документацию?

Ответ №1:

Если бы вы решили прочитать руководство fine, вы бы столкнулись с этим утверждением:

При считывании функциональной клавиши или клавиши со стрелкой каждая функция должна вызываться дважды; первый вызов возвращает 0 или 0xE0 , а второй вызов возвращает фактический код клавиши.

Вот как вы можете определить, когда 72 означает стрелку вверх, а когда это буква H (которая имеет ASCII-код 72).

Комментарии:

1. Значит, он считывает его как H или arrow? и какова будет фактическая реализация?

2. Я не понимаю вопроса.

Ответ №2:

введите описание изображения здесь

Внесены изменения:

Я удалил default из инструкции switch. Это вызывало нулевые отпечатки.

Кроме того, я также добавил kbhit() and #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;
}