Skip to content

Instantly share code, notes, and snippets.

@phaya
Last active December 24, 2015 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phaya/1abd04c09ee35024576c to your computer and use it in GitHub Desktop.
Save phaya/1abd04c09ee35024576c to your computer and use it in GitHub Desktop.
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;
}
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