Что возвращает getch() в Turbo C? Я уверен, что это не значения ASCII для нажатых клавиш

Что возвращает getch() в Turbo C? Я использовал его для инициализации клавиш со стрелками для программы, значения, возвращаемые getch(), были 77, 80, 72 и 75, которые являются значениями ASCII для алфавитов, что ясно указывает на то, что они не являются значениями ASCII. Если они не являются значениями ASCII, то что они собой представляют?


person himanshu tiwari    schedule 30.07.2014    source источник
comment
что заставляет вас думать, что клавиши со стрелками не могут возвращать символы алфавита? все сводится к эмуляции терминала.   -  person Marc B    schedule 30.07.2014
comment
могут ли два ключа иметь одинаковые значения ASCII? Это моя точка зрения.   -  person himanshu tiwari    schedule 30.07.2014
comment
с клавиатуры можно отправить более 255 различных событий. это означает, что некоторые нажатия клавиш будут генерировать многобайтовые выходные данные.   -  person Marc B    schedule 30.07.2014


Ответы (2)


getch(), указанный в нестандартном conio.h, возвращает int:

#include <conio.h>

int     getch(void);

из ссылки:

A single character from the predefined standard input handle is read and returned. 
The input is not buffered. If there is a character pending from ungetch 
(see section ungetch), it is returned instead. The character is not echoed to the 
screen. This function doesn't check for special characters like Ctrl-C.

If the standard input handle is connected to the console, any pending output in the 
stdout and stderr streams is flushed before reading the input, if these streams are 
connected to the console.

Return Value

    The character.

Portability

    ANSI/ISO C  No
    POSIX       No 

Ваша проблема со стрелками заключается в том, что они не являются однобайтовыми символами. Для обработки клавиш со стрелками необходимо обрабатывать многобайтовые коды. Цифры, которые вы получаете, являются просто одним из двух байтов кодов клавиш.

Пример чтения кодов см. в разделе (Как читать клавиши со стрелками) Чит-код в программировании на C (при вводе с клавиатуры)

person David C. Rankin    schedule 30.07.2014
comment
БЛАГОДАРЮ. Но я хочу точно знать, что возвращают ключи. Как я могу реализовать многобайтовый код? - person himanshu tiwari; 30.07.2014
comment
Проверьте ссылку в ответе. - person David C. Rankin; 30.07.2014
comment
@MatinLotfaliee - проверьте заголовочный файл: void delline(void); int getch(void); int getche(void); - person David C. Rankin; 30.07.2014
comment
@DavidC.Rankin - да. заголовок объявляет возвращаемое значение целым числом. но ваша ссылка говорит, что это персонаж. Кроме того, название функции показывает, что вы можете получить символы. Кстати, обработка многобайтовых кодов требует многократного вызова getch в Turbo C, поэтому ваш пример бесполезен. - person Matin Lotfaliee; 31.07.2014
comment
@MatinLotfaliee у тебя просто плохой день? Если вам от этого станет легче, смело продолжайте придумывать вопросы с ответом. Мне все равно. Поскольку я не привел примера, ваш язвительный комментарий о его бесполезности является спорным. Я уверен, что к этому моменту в вашем понимании C вы знаете, что «символ» представлен числовым значением, где термины часто используются взаимозаменяемо. Если у вас есть проблемы со ссылкой, сообщите об ошибке с помощью Turbo C, который является источником ссылки. - person David C. Rankin; 31.07.2014

Функция getch() возвращает два кода клавиш для клавиш со стрелками (и некоторых других специальных клавиш). Сначала она возвращает либо 0 (0x00), либо 224 (0xE0), а затем возвращает код, идентифицирующий нажатую клавишу.

Для клавиш со стрелками сначала возвращается 224, затем 72 (вверх), 80 (вниз), 75 (влево) и 77 (вправо). Если нажаты клавиши со стрелками на цифровой клавиатуре (с выключенным NumLock), getch() сначала возвращает 0 вместо 224.

Итак, вы можете сделать что-то вроде:

char ch = getch ();
if (ch == 0 || ch == 224)
{
    switch (getch ())
    {
    case 72:
        /* Code for up arrow handling */
        break;

    case 80:
        /* Code for down arrow handling */
        break;

    /* ... etc ... */
    }
}

Обратите внимание, что getch() никоим образом не стандартизирован, и эти коды могут различаться от компилятора к компилятору.

person Matin Lotfaliee    schedule 30.07.2014
comment
был ли этот ответ полезен? - person Matin Lotfaliee; 21.08.2014