17/04/2026
En el vasto universo de la programación en C y C++, especialmente cuando se trabaja con aplicaciones de consola, existen funciones que, aunque puedan parecer simples a primera vista, son fundamentales para la interacción con el usuario. Entre estas, _getch() y _getwch() destacan por una característica muy particular: permiten leer un carácter de la consola sin que este sea ‘ecoado’ o mostrado en pantalla. Esta capacidad es crucial para una variedad de aplicaciones, desde la entrada de contraseñas hasta el control en tiempo real de juegos basados en texto.

- ¿Qué Devuelven Exactamente _getch() y _getwch()?
- Características Clave y Comportamiento Singular
- _getch() vs. _getwch(): Una Comparativa Detallada
- Mapeos de Rutinas de Texto Genéricas (_gettch)
- Ejemplos de Aplicación y Utilidad
- Preguntas Frecuentes sobre _getch() y _getwch()
- ¿Para qué sirven _getch() y _getwch() principalmente?
- ¿Devuelven algún valor de error?
- ¿Cómo se leen las teclas de función o flechas con estas funciones?
- ¿Son _getch() y _getwch() seguras para hilos (thread-safe)?
- ¿Se pueden usar en aplicaciones modernas de Windows (UWP)?
- ¿Cuál es la diferencia fundamental entre _getch() y _getwch()?
- ¿Qué cabeceras se necesitan para usar estas funciones?
- Conclusión
¿Qué Devuelven Exactamente _getch() y _getwch()?
La pregunta central que nos convoca es qué valor de retorno ofrecen estas funciones. Ambas están diseñadas para devolver el carácter que ha sido leído desde la entrada estándar de la consola. Sin embargo, hay una diferencia clave en el tipo de datos que manejan, lo cual es fundamental para entender su uso en distintos contextos:
_getch(): Esta función devuelve un valor de tipoint. El entero representa el carácter ASCII o ANSI que fue presionado por el usuario. Es la opción más común cuando se trabaja con caracteres de un solo byte, típicos en la mayoría de los idiomas occidentales y para propósitos generales de entrada._getwch(): Por otro lado,_getwch()devuelve un valor de tipowint_t. Este tipo de dato está diseñado para manejar caracteres anchos (wide characters), que son necesarios para representar caracteres de conjuntos de caracteres extendidos, como Unicode. Esto es vital para aplicaciones que necesitan soportar múltiples idiomas o caracteres especiales que no encajan en el esquema de un solo byte.
Es importante destacar que, en ambos casos, no hay un valor de retorno de error explícito. La función simplemente espera y devuelve el carácter una vez que se ha ingresado. Esto significa que no es necesario verificar un código de error después de una llamada exitosa; la función siempre devolverá un carácter válido.
Características Clave y Comportamiento Singular
Más allá de su valor de retorno, _getch() y _getwch() poseen una serie de características y comportamientos que las hacen únicas y extremadamente útiles en el desarrollo de aplicaciones de consola:
Lectura Sin Eco (Non-Echoing Input)
La característica más definitoria de estas funciones es que leen un carácter de la consola sin que este sea mostrado en pantalla. Esto contrasta con funciones como getchar() o scanf(), que por defecto muestran el carácter ingresado. Esta capacidad es invaluable para:
- Entrada de Contraseñas: Cuando un usuario ingresa una contraseña, es una buena práctica de seguridad no mostrar los caracteres en la pantalla.
_getch()y_getwch()son perfectas para este fin. - Juegos o Aplicaciones Interactivos: En juegos de consola o aplicaciones que requieren una respuesta inmediata del usuario sin ‘contaminar’ la interfaz con cada pulsación de tecla, estas funciones permiten una experiencia de usuario más limpia.
- Menús de Selección Rápida: Permiten al usuario seleccionar una opción con una sola pulsación de tecla, sin necesidad de presionar Enter, agilizando la navegación.
Manejo de Teclas de Función y Flechas
Una particularidad importante a considerar es cómo estas funciones manejan las teclas especiales, como las teclas de función (F1-F12), las teclas de dirección (flechas), Insert, Supr, Inicio, Fin, Re Pág y Av Pág. Para leer una de estas teclas, la función debe ser llamada dos veces:
- Primera Llamada: La primera llamada a
_getch()o_getwch()devuelve un valor especial:0o0xE0(224 en decimal). Este valor indica que la siguiente lectura corresponderá a una tecla especial. - Segunda Llamada: La segunda llamada devuelve el código de escaneo (scan code) de la tecla específica que fue presionada. Cada tecla especial tiene un código de escaneo único que permite identificarla. Por ejemplo, la flecha arriba podría tener un código de escaneo de 72, la flecha abajo 80, etc.
Este mecanismo requiere una lógica adicional en el código para interpretar correctamente la entrada del usuario cuando se esperan este tipo de teclas.
Seguridad de Hilos (Thread Safety) y Versiones No Bloqueantes
Las funciones _getch() y _getwch() son seguras para hilos (thread-safe). Esto significa que bloquean el hilo de llamada hasta que un carácter es ingresado. Esta característica es beneficiosa en entornos multihilo, ya que garantiza que la operación de lectura de la consola se maneje de forma exclusiva por un hilo a la vez, evitando condiciones de carrera o inconsistencias en la entrada.
Para escenarios donde un comportamiento no bloqueante es preferible, Microsoft proporciona versiones adicionales de estas funciones:
_getch_nolock()_getwch_nolock()
Estas versiones no bloquean el hilo de llamada, lo que puede ser útil en aplicaciones donde la capacidad de respuesta es crítica y el hilo principal no debe pausarse esperando una entrada. Sin embargo, su uso requiere una gestión más cuidadosa de la concurrencia por parte del programador.
Estado Global y Compatibilidad
Por defecto, el estado global de estas funciones está limitado al ámbito de la aplicación. Para modificar este comportamiento, se puede consultar la documentación sobre el estado global en el CRT (C Runtime Library).
Es crucial mencionar una limitación importante: estas API no pueden ser utilizadas en aplicaciones que se ejecutan en el entorno de Windows Runtime (UWP). Si estás desarrollando una aplicación para la Plataforma Universal de Windows, deberás buscar métodos alternativos de entrada de usuario que sean compatibles con ese entorno.
_getch() vs. _getwch(): Una Comparativa Detallada
Aunque ambas funciones comparten el objetivo de leer un carácter sin eco, sus diferencias en el manejo de tipos de caracteres son clave. Aquí una tabla comparativa:
| Característica | _getch() | _getwch() |
|---|---|---|
| Tipo de Retorno | int | wint_t |
| Tipo de Carácter | ASCII / ANSI (un byte) | Caracteres Anchos (Unicode, multi-byte) |
| Uso Principal | Programas de consola con caracteres estándar | Programas de consola con soporte multi-idioma (internacionalización) |
| Cabecera Requerida | <conio.h> | <conio.h> o <wchar.h> |
| Compatibilidad UWP | No compatible | No compatible |
La elección entre una y otra dependerá fundamentalmente de si tu aplicación necesita manejar solo caracteres estándar o si requiere soporte para conjuntos de caracteres extendidos.
Mapeos de Rutinas de Texto Genéricas (_gettch)
Para facilitar la escritura de código que sea compatible con diferentes configuraciones de caracteres (multibyte, Unicode o estándar), la biblioteca C Runtime proporciona un mapeo de rutinas de texto genéricas. La función _gettch es un ejemplo de esto:
- Si las macros
_UNICODEy_MBCSno están definidas,_gettchse mapea a_getch. - Si la macro
_MBCSestá definida,_gettchtambién se mapea a_getch. - Si la macro
_UNICODEestá definida,_gettchse mapea a_getwch.
Este mecanismo permite a los desarrolladores escribir código más portable que se adapta automáticamente al tipo de carácter configurado en el proyecto, sin tener que cambiar explícitamente las llamadas a funciones.
Ejemplos de Aplicación y Utilidad
Imaginemos un programa simple que pide al usuario presionar 'Y' para salir. Con _getch(), el código podría verse así:
#include <conio.h> #include <ctype.h> #include <stdio.h> int main(void) { int ch; printf("Presiona 'Y' para salir: "); do { ch = _getch(); // Lee un caracter sin eco ch = toupper(ch); // Convierte a mayuscula para comparar } while (ch != 'Y'); _putch(ch); // Muestra la 'Y' final _putch('\r'); // Retorno de carro _putch('\n'); // Salto de linea return 0; }Este ejemplo ilustra cómo _getch() permite la entrada de un carácter sin que este se muestre en el búfer de la consola hasta que el programa decida explícitamente mostrarlo (en este caso, la 'Y' final). Este control granular sobre la entrada es lo que hace a estas funciones tan poderosas.
Preguntas Frecuentes sobre _getch() y _getwch()
A continuación, respondemos algunas de las preguntas más comunes relacionadas con estas útiles funciones de entrada de consola:
¿Para qué sirven _getch() y _getwch() principalmente?
Sirven para leer un solo carácter de la consola sin que este sea mostrado (ecoado) en la pantalla. Son ideales para la entrada de contraseñas, control de juegos en consola o menús interactivos donde no se desea que cada pulsación de tecla sea visible.
¿Devuelven algún valor de error?
No, ni _getch() ni _getwch() tienen un valor de retorno de error. Siempre devuelven el carácter leído o un código especial si se trata de una tecla de función o flecha.
¿Cómo se leen las teclas de función o flechas con estas funciones?
Para leer teclas especiales (como F1, F2, flechas), se necesitan dos llamadas a la función. La primera devuelve 0 o 0xE0, indicando una tecla especial. La segunda llamada devuelve el código de escaneo específico de esa tecla.
¿Son _getch() y _getwch() seguras para hilos (thread-safe)?
Sí, por defecto son seguras para hilos porque bloquean el hilo de llamada hasta que se recibe una entrada. Existen versiones no bloqueantes (_getch_nolock() y _getwch_nolock()) para escenarios que requieren un comportamiento diferente.
¿Se pueden usar en aplicaciones modernas de Windows (UWP)?
No, estas funciones no son compatibles con aplicaciones que se ejecutan en el entorno de Windows Runtime (UWP). Para el desarrollo en UWP, se deben utilizar las APIs específicas de la plataforma para la entrada de usuario.
¿Cuál es la diferencia fundamental entre _getch() y _getwch()?
La diferencia principal radica en el tipo de caracteres que manejan. _getch() maneja caracteres de un solo byte (ASCII/ANSI) y devuelve un int, mientras que _getwch() maneja caracteres anchos (Unicode, multi-byte) y devuelve un wint_t. Esto hace a _getwch() adecuada para aplicaciones que requieren soporte para múltiples idiomas.
¿Qué cabeceras se necesitan para usar estas funciones?
Para _getch(), se requiere la cabecera <conio.h>. Para _getwch(), se requiere <conio.h> o <wchar.h>.
Conclusión
_getch() y _getwch() son herramientas poderosas y específicas para la interacción con la consola en entornos de programación de bajo nivel en C/C++. Su capacidad de leer caracteres sin eco las convierte en opciones ideales para situaciones donde la privacidad o el control preciso de la interfaz de usuario son primordiales. Entender qué devuelven, cómo manejan las teclas especiales y sus limitaciones de compatibilidad es esencial para cualquier desarrollador que trabaje con aplicaciones de consola, permitiendo la creación de programas más interactivos y seguros. A pesar de las alternativas en entornos gráficos modernos, su relevancia persiste en el ámbito de las aplicaciones de línea de comandos, donde la eficiencia y el control directo sobre la entrada siguen siendo altamente valorados.
Si quieres conocer otros artículos parecidos a Entendiendo _getwch() y _getch(): Entrada sin Eco puedes visitar la categoría Librerías.
