[ Foro de C ]
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.
Es un problema de tu compilador. El fuente esta bien.
Muchas gracias. Me estaba volviendo loco buscando un fallo que no existe.
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.
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...
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.
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.)