Skip to content

Instantly share code, notes, and snippets.

@phaya
Last active December 24, 2015 17:59
Embed
What would you like to do?
El siguiente programa funciona incorrectamente ya que nunca llega a pedir el nombre, en cambio si cambiamos el orden en que se piden los datos al usuario (primero el nombre y luego la fecha) si que funciona ¿por qué? ¿cómo solucionarías el problema sin cambiar el orden? Además, ¿qué función emplearías para eliminar la insegura y peligrosa `gets`?
#include <stdio.h>
int main() {
int age;
char name[30];
printf("How old are you? ");
scanf("%d", &age);
printf("What's your name? ");
gets(name);
printf("Hi %s! You're %d years old", name, age);
return 0;
}
@artdiaz
Copy link

artdiaz commented Oct 7, 2013

Creo que el problema se debe a que una vez introduces por teclado el numero para age el gets(name) registra únicamente un 'intro', es decir, en una misma escritura estilo "18 intro" estamos mandando dos informaciones en una, el 18 para age y el intro para gets. Si invertimos el orden el "fallo" del 'intro' se salva.

Una posible ñapa seria con una variable extra de tipo char introducida entre el scanf de age y el gets podría hacer que ese 'intro' se lo lleve la variable auxiliar. Otra opción seria sustituir el "gets(name);" por "scanf("%s",name);", puesto que solo vamos a introducir el nombre y no suelen contener espacios (un problema para los nombres compuestos) no es necesario utilizar el gets

Copy link

ghost commented Oct 10, 2013

El problema es que gets lee las cadenas sin formato, mientras que scanf las lee con formato. Así scanf lee la entrada y convierte a entero la cadena que le entra, ovbiando el intro que acompaña al número que hemos tecleado para la edad. Pero scanf se lo traga ya que no distingue el tipo que le entra. Podríamos intentar solucionarlo de varias manera. Una es declarar una variable char para leer el intro y declararla en el scanf ("%d,%c", &age, leeintro); otra sería hcer dos lecturas con gets y otra sería implementar una condición. if(gets(name)==/0) printf(leido intro) else gets(name)

Copy link

ghost commented Oct 10, 2013

Es gets el que se lo traga todo.

@phaya
Copy link
Author

phaya commented Oct 12, 2013

¡Bien, bien! He realizado un post http://pablohaya.com/2013/10/12/diferencia-entre-scanf-gets-y-fgets/ con una descripción más detallada entre las diferencias entre scanf, gets y fgets. También se propone una solución alternativa a las que habéis dado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment