#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; | |
} |
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)
Es gets el que se lo traga todo.
¡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.
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