Utilice la función getchar en C

Jinku Hu 12 octubre 2023
  1. Utilice la función getchar para leer un solo carácter del flujo de entrada estándar en C
  2. Utilice la función getchar para leer la entrada de cadena en C
Utilice la función getchar en C

Este artículo demostrará varios métodos sobre cómo utilizar la función getchar en C.

Utilice la función getchar para leer un solo carácter del flujo de entrada estándar en C

La función getchar es parte de las utilidades estándar de entrada/salida incluidas en la biblioteca C. Hay múltiples funciones para operaciones de entrada/salida de caracteres como fgetc, getc, fputc o putchar. fgetc y getc básicamente tienen características equivalentes; toman el puntero de flujo de archivos para leer un carácter y lo devuelven como un unsigned char fundido convertido a un tipo int.

Tenga en cuenta que getchar es el caso específico de getc que pasa implícitamente el flujo de archivos stdin como argumento para leer caracteres. Por lo tanto, getchar no toma argumentos y devuelve el carácter leído emitido al tipo int. En el siguiente ejemplo, demostramos el escenario básico de ingresar un solo carácter e imprimirlo con la función putchar.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int ch;

  printf("Please, input a single character: ");
  ch = getchar();
  putchar(ch);

  exit(EXIT_SUCCESS);
}

Utilice la función getchar para leer la entrada de cadena en C

Alternativamente, podemos implementar un bucle para leer la entrada de la cadena hasta que se encuentre la nueva línea o EOF, y almacenarla en un búfer char preasignado. Sin embargo, tenga en cuenta que este método agrega una sobrecarga de rendimiento en comparación con las llamadas a gets o getline, que son funciones de biblioteca que implementan la misma característica. La parte principal de la solución es un bucle while que se ejecuta hasta que el valor devuelto por la función getchar no es igual al carácter de nueva línea o EOF.

En este caso, asignamos arbitrariamente un array char de tamaño: 20 caracteres. En cada iteración, se implementa el puntero al primer elemento del array y se le asigna el valor de retorno de getchar. Finalmente, sacamos el búfer con la llamada a la función printf.

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  char *p;
  int ch;

  p = buf;
  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    *p++ = (char)ch;
  }
  *p++ = 0;
  if (ch == EOF) {
    printf("EOF encountered\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Producción :

Please, provide input: string longer than 20 characters
string longer than 20 characters

Aunque el código de ejemplo anterior normalmente funciona bien, tiene varios errores que pueden resultar en errores de desbordamiento del búfer o terminación anormal del programa. Dado que procesamos la entrada del usuario hasta que se encuentra la nueva línea o EOF, no hay garantías de que quepa en el búfer char de tamaño fijo. Si tenemos que usar un búfer fijo, somos responsables de mantener un recuento del tamaño de entrada y de dejar de almacenarlo en el búfer una vez que se alcanza la capacidad.

Después de resolver este problema en el código anterior, tenemos que lidiar con la declaración printf que usa el especificador %s para imprimir el contenido del búfer. Tenga en cuenta que no hay garantía de que el último carácter de la cadena de entrada sea un byte nulo, por lo que la llamada printf no sabría dónde detenerse si el propio usuario no inserta el byte nulo al final del búfer. El siguiente código de muestra corrige los errores anteriores y agrega algunas líneas para una mejor demostración.

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void) {
  char buf[SIZE];
  int ch;
  size_t index = 0;
  size_t chars_read = 0;

  printf("Please, provide input: ");
  while ((ch = getchar()) != '\n' && ch != EOF) {
    if (index < sizeof(buf) - 1) {
      buf[index++] = (char)ch;
    }
    chars_read++;
  }
  buf[index] = '\0';
  if (ch == EOF) {
    printf("EOF encountered\n");
  }
  if (chars_read > index) {
    printf("Truncation occured!\n");
  }

  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Producción :

Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C Char