getchar() возвращает одинаковое значение (27) для клавиш со стрелками вверх и вниз

Таким образом, для клавиши "вверх" на клавиатуре я получаю 27, что удивительно, для клавиши "вниз" я также получаю 27. Мне нужно, чтобы моя программа работала по-разному на клавишах "вверх" и "вниз", и я не могу этого понять. Я использую Linux, и мне нужно, чтобы он работал для Linux.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    int c = getchar();

    if(c==27)
    {
        printf("UP");
    }

    if(c==28)
    {
        printf("DOWN");
    }

} 

5 ответов

27 подразумевает, что вы получаете escape-последовательности ANSI для стрелок. Это будут трехсимвольные последовательности: 27, 91, а затем 65, 66, 67, 68 (IIRC) для вверх, вниз, вправо, влево. Если вы получите 27 от звонка до getchar()затем позвоните еще дважды, чтобы получить 91 и число, которое определяет, какая клавиша со стрелкой была нажата.

Как уже упоминалось, это зависит от платформы, но вам может быть все равно.

Вот программа, написанная для использования библиотеки ncurses и отображения нажатых клавиш со стрелками.

#include<ncurses.h>

int main()
{
int ch;

/* Curses Initialisations */
initscr();
raw();
keypad(stdscr, TRUE);
noecho();

printw("Press E to Exit\n");

while((ch = getch()) != 'E')
{
    switch(ch)
    {
    case KEY_UP:         printw("\nUp Arrow");
                break;
    case KEY_DOWN:      printw("\nDown Arrow");
                break;
    case KEY_LEFT:      printw("\nLeft Arrow");
                break;
    case KEY_RIGHT:     printw("\nRight Arrow");
                break;
    default:    
                printw("\nThe pressed key is %c",ch);

    }
}

printw("\n\Exiting Now\n");
endwin();

return 0;
}

во время компиляции вы должны сделать ссылку на библиотеку ncurses.

gcc main.c -lncurses

Вот учебник, который поможет вам начать работу с ncurses.

Посетите библиотеку ncurses по адресу http://www.gnu.org/software/ncurses/. Связав его с вашей программой, вы сможете делать всякие полезные вещи с ключевыми событиями. Прочтите документацию и посмотрите, хотите ли вы ее использовать. Он обеспечивает именно ту функциональность, о которой вы говорите, что ищете.

Удачного кодирования!

Этот ответ предназначен только для будущих ссылок; использоватьgetch()вместоgetchar().

У меня была такая же проблема (получение escape-последовательности при нажатии стрелок), и это изменило фиксированные вещи.

Если вы используетеcurses.hвам нужно будет добавить следующую строку, прежде чем читать:

      keypad(stdscr, TRUE);

Вы путаете клавиши, которые нажимаете, с символами, которые они генерируют при нажатии. Ожидаете ли вы получить один символ при нажатии клавиши Shift? Попробуйте эту программу:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    do
    {
        int c = getchar();
        printf("c=%d\n", c);
    }
    while (1);
}

Попробуйте нажать стрелку вверх, а затем введите. Затем попробуйте нажать стрелку вниз и затем войти. Вы увидите, что преобразование ключей в символы не является простым.

Другие вопросы по тегам