Documentos de Académico
Documentos de Profesional
Documentos de Cultura
char nombre[30];
printf("Escribe tu nombre: ");
gets(nombre);
char nombre[30];
printf("Escribe tu nombre: ");
fgets(nombre, 30, stdin);
"Jorge\n"
Limpieza de buffer
50\n
\n
25\n
\n
Hasta aquí todo funciona bien, ya que se ha utilizado únicamente
scanf, pero la siguiente instrucción de entrada es fgets y es
entonces donde aparece el problema. Puesto que fgets lee lo que haya
en el buffer sin descartar nada, se encontrará directamente con un
'\n' (justo el caracter que le indica que deje de leer), así que lo
asignará a la cadena, y saltará a la siguiente instrucción, sin
habernos dejado escribir nada. La solución pasa por limpiar el buffer
de entrada después de un scanf, si la siguiente instrucción es una
lectura de cadena con gets o fgets. Hay quienes sugieren utilizar
para esto:
fflush(stdin)
int c;
while ((c = getchar()) != '\n' && c != EOF);
Función
char nombre[30];
printf("Escribe un nombre: ");
leestring(nombre, 30);
Además, devuelve un valor de tipo entero, que servirá para
verificar si hubo un error.
Puesto que queremos una función que se pueda usar de forma más
o menos general, primero hay que verificar si el buffer está limpio,
o si hay un '\n' dejado por scanf y, en ese caso, limpiarlo:
int i, c;
/* Comprobación */
c=getchar();
if (c == EOF) {
cad[0] = '\0';
return 0;
}
if (c == '\n')
i = 0;
else {
cad[0]=c;
i = 1;
}