¿Qué devuelve getch() en Turbo C?Estoy seguro de que no son valores ASCII para las teclas presionadas.
Pregunta
¿Qué devuelve getch() en Turbo C?Lo usé para inicializar las teclas de flecha de un programa, los valores devueltos por getch() fueron 77, 80, 72 y 75, que son valores ASCII para alfabetos, lo que indica claramente que no son valores ASCII.Si no son valores ASCII, ¿qué son?
Solución
getch()
proporcionado en el no estándar conio.h
devuelve un entero:
#include <conio.h>
int getch(void);
de la referencia:
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
Tu problema con las teclas de flecha es que no son caracteres de un solo byte.Para poder manejar las teclas de flecha debes manejar multibyte códigos.Los números que obtiene son simplemente uno de los dos bytes de los códigos clave.
Para ver un ejemplo de lectura de códigos, consulte (Cómo leer las teclas de flecha) Código de trucos en programación C (cuando se ingresa desde el teclado)
Otros consejos
getch () devuelve dos códigos clave para las teclas de flecha (y algunas otras teclas especiales), devuelve 0 (0x00) o 224 (0xe0) primero, y luego devuelve un código que identifica la clave que se presionó.
Para las teclas de flecha, devuelve 224 seguido por primera vez por 72 (arriba), 80 (abajo), 75 (izquierda) y 77 (derecha).Si se presionan las teclas de flecha de num-pad (con NumLock Off), GOTCH () devuelve 0 primero en lugar de 224.
Entonces, puedes hacer 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 ... */
}
}
Tenga en cuenta que GOTCH () no está estandarizada de ninguna manera, y estos códigos pueden variar de compilador a compilador.