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");
    }

} 

person NoNameY0    schedule 09.03.2013    source источник
comment
@MitchWheat Как я могу решить эту проблему?   -  person NoNameY0    schedule 09.03.2013
comment
Я считаю, что вы можете использовать wgetch() в curses, чтобы справиться с этим.   -  person Memento Mori    schedule 09.03.2013


Ответы (4)


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

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

person Ernest Friedman-Hill    schedule 09.03.2013
comment
Итак, каким должен быть мой подход? Моя программа C должна вести себя по-разному, когда пользователь нажимает вверх, и по-другому, когда он нажимает в консоли. - person NoNameY0; 09.03.2013
comment
@RichardMckenna: используйте библиотеку. Curses или Readline, в зависимости от того, что делает ваша программа. - person Dietrich Epp; 09.03.2013

Вот программа, которая написана для использования библиотеки 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.

person Barath Ravikumar    schedule 09.03.2013
comment
почему он не компилируется в Netbeans? - person NoNameY0; 09.03.2013
comment
@RichardMckenna, эта программа на C была написана для компилятора gcc в Linux (и она работает). Внесите соответствующие изменения для netbeans и заставьте его работать - person Barath Ravikumar; 09.03.2013
comment
вы должны связать его с ncurses, при компиляции gcc main.c -lncurses, но сначала вы должны убедиться, что у вас установлена ​​библиотека ncurses - person Barath Ravikumar; 09.03.2013
comment
есть ли альтернативный способ определения клавиши вверх и вниз. Это не может быть так сложно - person NoNameY0; 09.03.2013
comment
поскольку клавиши со стрелками не имеют значений ascii, используя только c, не может быть такого способа определения этих клавиш, использование библиотек поддержки, таких как ncurses, может быть единственным вариантом - person Barath Ravikumar; 09.03.2013
comment
Можешь написать мне, мне нужно поговорить с тобой о чем-то важном. - person NoNameY0; 09.03.2013
comment
@RichardMckenna хорошо, приятель, я не знаю, когда у меня будет свободное время, поэтому не могу ни с кем поболтать, если у вас есть технические сомнения, опубликуйте это, я обязательно посмотрю ваши вопросы и отвечу на них . - person Barath Ravikumar; 09.03.2013

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

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

person RouteMapper    schedule 09.03.2013

Вы путаете клавиши, которые вы нажимаете, с символами, которые они генерируют при нажатии. Ожидаете ли вы получить один символ при нажатии клавиши 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);
}

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

person David Schwartz    schedule 09.03.2013
comment
Итак, каким должен быть мой подход? Моя программа C должна вести себя по-разному, когда пользователь нажимает вверх, и по-другому, когда он нажимает в консоли. - person NoNameY0; 09.03.2013
comment
Вы запустили мою программу? Вы получаете разные значения, поэтому можете вести себя по-разному. Вы ошиблись, просто думая, что между ключами и символами будет однозначное соответствие. Если вы хотите по-разному реагировать, если человек ввел a со сдвигом или без него, вы можете это сделать, потому что вы получаете разные символы, даже если нет символа клавиши Shift. - person David Schwartz; 09.03.2013