uso sirve que para libreria getche c io console-application stdio c-standard-library

sirve - ¿Cuál es la diferencia entre getch() y getchar()?



getche (4)

¿Cuál es la diferencia exacta entre las funciones getch y getchar ?


La función estándar de C es getchar() , declarada en <stdio.h> . Ha existido básicamente desde los albores del tiempo. Lee un carácter de la entrada estándar ( stdin ), que normalmente es el teclado del usuario, a menos que se haya redirigido (por ejemplo, a través del carácter de redirección de entrada de shell < o una canalización).

getch() y getche() son funciones antiguas de MS-DOS, declaradas en <conio.h> , y siguen siendo populares en los sistemas Windows. No son funciones estándar C; No existen en todos los sistemas. getch lee una pulsación de tecla del teclado inmediatamente, sin esperar a que el usuario presione la tecla de retorno, y sin hacer eco de la pulsación de tecla. getche es el mismo, excepto que hace eco. Por lo que sé, getch y getche siempre leen desde el teclado; no se ven afectados por la redirección de entrada.

La pregunta surge naturalmente, si getchar es la función estándar, ¿cómo la usa para leer un carácter sin esperar la tecla de retorno o sin hacer eco? Y las respuestas a esas preguntas son al menos un poco complicadas. (De hecho, son lo suficientemente complicados que sospecho que explican la popularidad duradera de getch y getche , que, si no es nada más fácil de usar).

Y la respuesta es que getchar no tiene control sobre detalles como el eco y el almacenamiento en búfer de entrada. En lo que respecta a C, estos son problemas de menor nivel que dependen del sistema.

Pero es útil comprender el modelo de entrada básico que asume getchar . Confusamente, normalmente hay dos niveles diferentes de almacenamiento en búfer.

  1. A medida que el usuario escribe las teclas en el teclado, el controlador de terminal del sistema operativo las lee. Por lo general, en su modo predeterminado, el controlador del terminal repite las pulsaciones de teclado inmediatamente a medida que se escriben (para que el usuario pueda ver lo que están escribiendo). Por lo general, en su modo predeterminado, el controlador del terminal también admite cierta cantidad de edición de línea, por ejemplo, el usuario puede presionar la tecla Eliminar o Retroceso para eliminar un carácter escrito accidentalmente. Para admitir la edición de líneas, el controlador del terminal normalmente está recopilando caracteres en un búfer de entrada . Solo cuando el usuario pulsa Retorno, el contenido de ese búfer se pone a disposición del programa que realiza la llamada. (Este nivel de almacenamiento en búfer está presente solo si la entrada estándar es en realidad un teclado u otro dispositivo serie. Si la entrada estándar se ha redirigido a un archivo o canalización, el controlador del terminal no está vigente y este nivel de almacenamiento en búfer no se aplica).

  2. El paquete stdio lee los caracteres del sistema operativo en su propio búfer de entrada. getchar simplemente obtiene el siguiente carácter de ese búfer. Cuando el búfer está vacío, el paquete stdio intenta rellenarlo leyendo más caracteres del sistema operativo.

Entonces, si rastreamos lo que ocurre cuando un programa llama a getchar por primera vez: stdio descubre que su búfer de entrada está vacío, por lo que intenta leer algunos caracteres del sistema operativo, pero aún no hay caracteres disponibles, por lo que los bloques de llamada de read . Mientras tanto, el usuario puede estar escribiendo algunos caracteres, que se están acumulando en el búfer de entrada del controlador del terminal, pero el usuario todavía no ha pulsado Retorno. Finalmente, el usuario pulsa Retorno y la llamada de read bloqueada devuelve, devolviendo el valor de una línea completa de caracteres a stdio , que los utiliza para completar su búfer de entrada, de los cuales devuelve el primero a esa llamada inicial a getchar , que Ha estado esperando pacientemente todo este tiempo. (Y luego, si el programa llama a getchar por segunda o tercera vez, es probable que haya más caracteres, los siguientes caracteres en la línea que escribió el usuario, disponibles en el búfer de entrada de getchar para que getchar regrese de inmediato. , vea la sección 6.2 de estas notas del curso en C ).

Pero en todo esto, como puede ver, getchar y el paquete stdio no tienen control sobre detalles como el eco o la edición de la línea de entrada, porque se manejan antes, en un nivel inferior, en el controlador de terminal, en el paso 1.

Por lo tanto, al menos en sistemas operativos similares a Unix, si desea leer un carácter sin esperar la tecla de retorno, o controlar si los caracteres se repiten o no, puede hacerlo ajustando el comportamiento del controlador del terminal. Los detalles varían, pero hay una manera de activar y desactivar el eco, y una forma (en realidad un par de formas) de activar y desactivar la edición de la línea de entrada. (Para al menos algunos de esos detalles, vea esta pregunta SO o la pregunta 19.1 en la antigua lista de Preguntas Frecuentes de C ).

Cuando la edición de la línea de entrada está desactivada, el sistema operativo puede devolver los caracteres inmediatamente (sin esperar la tecla Retorno), porque en ese caso no tiene que preocuparse de que el usuario haya escrito una pulsación de tecla incorrecta que deba "tomarse Atrás "con la tecla Suprimir o Retroceso. (Pero de la misma manera, cuando un programa desactiva la edición de la línea de entrada en el controlador del terminal, si quiere permitir que el usuario corrija los errores, debe implementar su propia edición, ya que se verá --- es decir, sucesiva las llamadas a getchar van a regresar (tanto el (los) carácter (es) incorrecto (s) del usuario como el código de carácter para la tecla Suprimir o Retroceso)


getch() solo recibe una entrada, pero nunca la muestra como salida en la pantalla a pesar de que presionemos una tecla Intro.

getchar() obtiene una entrada y la muestra en la pantalla cuando presionamos la tecla enter.


getchar() es una función estándar que obtiene un carácter del stdin.

getch() no es estándar. Obtiene un carácter del teclado (que puede ser diferente del stdin) y no lo repite.


  • getchar es estándar C, encontrado en stdio.h. Lee un carácter de stdin (el flujo de entrada estándar = entrada de consola en la mayoría de los sistemas). Es una llamada de bloqueo, ya que requiere que el usuario escriba un carácter y luego presione Intro. Se hace eco de la entrada del usuario a la pantalla.

  • getc(stdin) es 100% equivalente a getchar , excepto que también puede usarse para otros flujos de entrada.

  • getch no es estándar, generalmente se encuentra en el antiguo y obsoleto encabezado de MS DOS conio.h. Funciona igual que getchar excepto que no se bloquea después de la primera pulsación de tecla, permite que el programa continúe sin que el usuario presione Intro. No hace eco de entrada a la pantalla.

  • getche es lo mismo que getch , también no estándar, pero hace eco en la entrada a la pantalla.