Como hemos visto en el apartado anterior, las funciones gets
y scanf usadas para leer cadenas de caracteres son propensas a errores, pues
no controlan que el usuario haya introducido más caracteres que el que puede
albergar el array definido para almacenarlos. Para ello, contamos con dos
funciones que hacen segura la lectura de cadenas introducidas por el
usuario, que son fgets
y getline
.
fgets
La sintaxis de la función fgets
es:
#include <stdio.h> char *fgets(char *s, int n, FILE *stream);
s
referencia a un array de caracteres, que
almacena lo que lee de un fichero apuntado por
stream
. n
especifica el número máximo de
elementos del array (caracteres). La función lee hasta n-1
caracteres, y añade el caracter nulo para que la cadena quede bien
formada. Si no ha llegado hasta n-1 caracteres pero llega a un caracter de
nueva línea, '\n', también para de leer y devuelve la cadena (con ese
carácter de nueva línea incluido). Si no hay errores, la función devuelve
el puntero s
. Si encuentra el final de fichero (EOF) o existe
algún error, devuelve null
.
fgets
es así más segura que
gets
, pero tienes que lidiar con un par de cosas. Una es que
si has introducido más caracteres de los que ha podido leer, el resto de
caracteres se quedan en el buffer de entrada (en stdin), así que tendrás
que eliminarlos para que no sean leídos en el próximo fgets
si no quieres. Lo segundo es que fgets
incluye el carácter
'\n' al final, así que tendrás que quitarlo.