Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#define NUM_CHARS 80
int main(void)
{
char nombre[NUM_CHARS];
printf("Indica tu nombre: ");
fflush(stdout);
if (gets(nombre) == NULL)
return EXIT_FAILURE;
printf("Hola %s!\n", nombre);
return EXIT_SUCCESS;
}
Código: Seleccionar todo
gets(nombre)
----
La solución es remplazar el uso de "gets" por fgets, esta ultima tiene la ventaja de aceptar, como segundo argumento, el numero máximo de caracteres a almacenar. El programa anterior corregido:
Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#define NUM_CHARS 80
int main(void)
{
char nombre[NUM_CHARS];
printf("Indica tu nombre: ");
fflush(stdout);
if (fgets(nombre, NUM_CHARS, stdin) == NULL)
return EXIT_FAILURE;
printf("Hola %s!\n", nombre);
return EXIT_SUCCESS;
}
----
Una diferencia importante entre "gets" y "fgets" es que esta ultima no descarta el carácter de avance de linea (el '\n'), este se almacena como parte de la cadena. Para obtener un comportamiento idéntico debemos descartar ese carácter para lo cual hay varias opciones:
A) Mediante un bucle encontramos el '\0' en la cadena, verificamos el carácter anterior y lo eliminamos si es el avance de linea.
B) Utilizando la función "strlen" (prototipo en <string.h>) obtenemos la longitud de la cadena, verificamos el carácter anterior y lo eliminamos si es el avance de linea.
C) Buscamos directamente el avance de linea mediante la función "strchr" (prototipo en <string.h>), si este existe lo eliminamos sustituyéndolo con un '\0'.
Un programa de ejemplo utilizando la primera aproximación:
Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#define NUM_CHARS 80
char *usr_fgets(char *cad, int num_chars, FILE *entrada);
int main(void)
{
char nombre[NUM_CHARS];
printf("Indica tu nombre: ");
fflush(stdout);
if (usr_fgets(nombre, NUM_CHARS, stdin) == NULL)
return EXIT_FAILURE;
printf("Hola %s!\n", nombre);
return EXIT_SUCCESS;
}
char *usr_fgets(char *cad, int num_chars, FILE *entrada)
{
int i;
if (fgets(cad, num_chars, entrada) == NULL)
return NULL;
/* Buscamos y eliminamos (si existe) el caracter '\n' */
for (i = 0; cad[i] != '\0'; i++)
;
if (i > 0 && cad[i - 1] == '\n')
cad[i - 1] = '\0';
return cad;
}