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);
}
Попробуйте нажать стрелку вверх, а затем введите. Затем попробуйте нажать стрелку вниз и затем войти. Вы увидите, что преобразование ключей в символы не является простым.