Introducción
Todos estamos familiarizados con la función scanf()
. Es la principal función aplicable para tomar entradas básicas del usuario. Aunque scanf()
funciona muy bien al tomar entradas como entero, carácter, flotante, etc., ciertamente se queda atrás al tomar entradas de cadenas que contienen espacios en blanco. Echemos un vistazo a un ejemplo,
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the string: ");
scanf("%s", string);
printf("\n %s",string);
return 0;
}
Salida:

Como podemos observar en el ejemplo anterior, scanf()
se detiene al encontrar un espacio en blanco o una nueva línea. De hecho, esto hace que tomar entradas de cadenas usando scanf()
sea un poco problemático. Esto se puede evitar fácilmente utilizando algunas otras funciones de entrada como gets()
y fgets()
.
En este artículo, vamos a aprender cómo aplicar ambas funciones y compararlas una al lado de la otra.
Función gets() en C
gets()
es una función predefinida en C que se utiliza para leer una cadena o una línea de texto. Y almacena la entrada en una variable de cadena bien definida. La función termina su sesión de lectura tan pronto como encuentra un carácter de nueva línea.
Sintaxis:
gets(nombre de la variable);
El código proporcionado a continuación ilustra el uso de la función gets()
.
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the String: ");
gets(string);
printf("\n%s",string);
return 0;
}
Salida:

Compara la salida con la que se obtiene al usar scanf()
. ‘Hello World’ ahora se trata como una cadena única.
Función fgets() en C
La biblioteca estándar de C también nos proporciona otra función, la función fgets()
. La función lee una línea de texto o una cadena desde el archivo o la consola especificados. Y luego la almacena en la variable de cadena respectiva.
Similar a la función gets()
, fgets también termina la lectura cuando encuentra un carácter de nueva línea. Pero además, a diferencia de gets()
, la función también se detiene cuando se alcanza EOF o incluso si la longitud de la cadena excede el límite especificado, n-1.
Sintaxis,
fgets(char *str, int n, FILE *stream)
- str – Es la variable en la que se va a almacenar la cadena
- n – It is the maximum length of the string that should be read
- stream – Es el identificador de archivo, desde donde se va a leer la cadena.
Afortunadamente, podemos leer tanto líneas de texto desde un archivo como desde el flujo de entrada estándar usando la función fgets()
. Veamos cómo.
1. Leer de un archivo dado usando fgets()
Por ejemplo,
#include<stdio.h>
int main()
{
char string[20];
FILE *fp;
fp=fopen("file.txt","r");
fgets(string,20,fp);
printf("The string is: %s",string);
fclose(fp);
return 0;
}
Considera file.txt para contener la línea ‘JournalDev fgets() ejemplo!’. En ese caso, la salida del código anterior sería,

2. Leer de stdin usando fgets()
#include<stdio.h>
int main()
{
char string[20];
printf("Enter the string: ");
fgets(string,20,stdin); #input from stdin stream
printf("\nThe string is: %s",string);
return 0;
}
Salida:

Conclusión
Aunque ambas funciones, gets()
y fgets()
pueden usarse para leer entradas de cadena. La mayor diferencia entre las dos es el hecho de que la última permite al usuario especificar el tamaño del búfer. Por lo tanto, se recomienda altamente sobre la función gets()
.
La función gets()
no tiene la provisión para el caso de que la entrada sea mayor que el búfer. Como resultado, puede ocurrir congestión de memoria. Esta es la parte donde la función fgets()
brilla y proporciona una solución definitiva.
Referencias
Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming