O que getch() no Turbo C retorna?Tenho certeza de que não são valores ASCII para teclas pressionadas

StackOverflow https://stackoverflow.com//questions/25045096

  •  21-12-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top