[ Foro de C ]

problemas con el ejercicio 5.2.7

19-Jun-2013 13:40
Jose Manuel Illanes Juan
6 Respuestas

Hola, tengo problemas con el programa siguiente:
Un programa que pida tu nombre, tu día de nacimiento y tu mes de
nacimiento y lo junte todo en una cadena, separando el nombre de la fecha por una coma y el
día del mes por una barra inclinada, así: ?Juan, nacido el 31/12?.

Mi codigo es el siguiente:

#include<stdio.h>
#include<string.h>

main()
{

char cadena[150],nombre[20],dia[2],mes[12];

printf("¿como te llamas?\n");
gets(nombre);


printf("¿que dia nacistes?\n");
gets(dia);


printf("Por último: ¿en que mes nacistes?");
gets(mes);


sprintf(cadena,"Hola %s, tu fecha de nacimiento es %s,%s \n",nombre,dia,mes);
puts(cadena);

return 0;

}

Lo hace todo bien pero al final muestra en pantalla lo siguiente:

#include<stdio.h>
#include<string.h>

main()
{

char cadena[150],nombre[20],dia[2],mes[12];

printf("¿como te llamas?\n");
gets(nombre);


printf("¿que dia nacistes?\n");
gets(dia);


printf("Por último: ¿en que mes nacistes?");
gets(mes);


sprintf(cadena,"Hola %s, tu fecha de nacimiento es %s/%s \n",nombre,dia,mes);
puts(cadena);

return 0;

}

Hola Jose, tu fecha de nacimiento es 04Hola Jose, tu fecha de nacimiento es /10

No se cual es el problema espero que me puedan ayudar gracias.


19-Jun-2013 18:26
David Garcia

Es un problema de tu compilador. El fuente esta bien.


20-Jun-2013 18:37
Jose Manuel Illanes Juan

Muchas gracias. Me estaba volviendo loco buscando un fallo que no existe.


21-Jun-2013 23:52
Nacho Cabanes (+83)

Yo sí veo algún posible problema.

Por ejemplo, en "char dia[2];", se reservan dos caracteres para el día. Dado que las cadenas deben terminar en un carácter nulo, sólo se comportará bien cuando el día tenga una única cifra.

Si el día tiene más de una cifra, no existirá separación del siguiente dato (el mes), por lo que pueden aparecer cosas como que el día es "10enero".

A eso se refieren los compiladores modernos cuando dicen que "gets" no es una operación segura porque no hace comprobaciones de tamaño: es responsabilidad tuya asegurarte de que dejas suficiente espacio.



22-Jun-2013 12:50
David Garcia

Nada mas lejos de contradecirle, copie el codigo y le hice varias pruebas y todas daban resultado satisfactorio.
Puede ser problema del compilador??
Yo use borland c y dev c++ y en los dos me fue bien...


22-Jun-2013 13:00
Jose Manuel Illanes Juan

Yo uso linux ubuntu asi que compilo directamente desde la terminal.
Tengo que decir que hice caso a Nacho y puse dia[3] (como maximo un dia tiene dos cifras) y compile el programa de nuevo y ya sale bien.

Supongo que si importa lo del espacio que reserves para los datos.

Muchas gracias.

Por mi parte problema resuelto.


26-Jun-2013 18:33
Nacho Cabanes (+83)

Efectivamente, es cuestión del compilador.

El estándar dice que un "char[2]" sólo permitirá guardar un espacio (y el caracter nulo que marca el final de cadena), o al menos es es lo que ocurrirá si se usan las funciones de la biblioteca estándar de C (otra cosa es si tú recorres la cadena letra a letra, aprovechando que sabes que tendrá 2 letras).

Eso no quita que algún compilador concreto pueda "redondear al alza", por ejemplo usando bloques de 16 bytes como mínimo para cada cadena, de modo un un "char[2]" se comportase realmente como un "char[16]", pero eso no es lo habitual.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)