O que getch() no Turbo C retorna?Tenho certeza de que não são valores ASCII para teclas pressionadas
Pergunta
O que getch() no Turbo C retorna?Usei-o para inicializar as teclas de seta de um programa, os valores retornados por getch() foram 77, 80, 72 e 75, que são valores ASCII para alfabetos, o que indica claramente que não são valores ASCII.Se não são valores ASCII, então o que são?
Solução
getch()
fornecido no padrão conio.h
retorna um int:
#include <conio.h>
int getch(void);
da referência:
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
Seu problema com as teclas de seta é que elas não são caracteres de byte único.Para lidar com as teclas de seta, você deve lidar com multibyte códigos.Os números que você está obtendo são simplesmente um dos dois bytes dos códigos-chave.
Para um exemplo de leitura dos códigos, consulte (Como ler as teclas de seta) Código de trapaça na programação C (quando inserido pelo teclado)
Outras dicas
A função getch() retorna dois códigos de teclas para teclas de seta (e algumas outras teclas especiais). Ela retorna 0 (0x00) ou 224 (0xE0) primeiro e depois retorna um código identificando a tecla que foi pressionada.
Para as teclas de seta, retorna 224 primeiro, seguido por 72 (para cima), 80 (para baixo), 75 (esquerda) e 77 (direita).Se as teclas de seta do teclado numérico (com NumLock desativado) forem pressionadas, getch() retornará 0 primeiro em vez de 224.
Então, você pode fazer algo como:
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 ... */
}
}
Observe que getch() não é padronizado de forma alguma e esses códigos podem variar de compilador para compilador.