Utilice 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 -
Utilice la función
getchar
para leer la entrada de cadena 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
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