Necesito introducir cuatro enteros y transformarlos en una IP normal que devuelva un puntero a char.
El caso es que no sé que falla en el programa.
#include <stdio.h>
#include <stdlib.h>
char *IP(int d1, int d2, int d3, int d4){
char *dir;
dir=(char*)malloc(sizeof(char));
if (d1>255 || d2>255 || d3>255 || d4>255){
sprintf(*dir,"Error: os datos introducidos son incorrectos");
exit(1);
}
else {
sprintf(*dir,"%d.%d.%d.%d",d1,d2,d4,d4);
}
return dir;
}
main(){
int a,b,c,d;
printf("Inserte 1 campo: ");
scanf("%d",&a);
printf("Inserte 2 campo: ");
scanf("%d",&b);
printf("Inserte 3 campo: ");
scanf("%d",&c);
printf("Inserte 4 campo: ");
scanf("%d",&d);
*IP(a,b,c,d);
puts(*IP);
return(0);
}
el problema es que cuando haces return, las variebles internas son desalojadas... vas a pasar el puntero, pero el contenido de ese puntero fue destruido al salir de la función... debes declarar el char y pasarla como parametro a la función para que se trabaje sobre ese valor por referencia (y dejas la función como void)
Línea 7: A malloc debes darle la cantidad de bytes que debe reservar y tu tan solo le dices que reserve un byte que es lo que devuelve sizeof(char). Una dirección estilo aaa.bbb.ccc.ddd tiene 16 bytes: cuatro ternas de números, tres puntos y el caracter nulo de fin de cadena. Por tanto debes reservar memoria de esta forma:
dir = malloc(16 * sizeof(char));
Línea 9: Vas a imprimir un error y a salir, no debes usar sprintf porqué nunca se imprimirá el mensaje, usa un printf normal o un fprintf a stderr, si lo prefieres.
Línea 13: sprintf espera un puntero a la cadena, no el contenido del primer elemento. Quita el asterisco a dir. De igual forma revisa las variables que van a construir la cadena, te falta la variable d3 y te sobra una d4.
Línea 20: Los estándares actuales de C esperan que main sea declarada como una función que devuelve un entero. Defínela como int main....
Línea 22: Ya que vas a devolver un puntero con la función necesitas de una variable que lo reciba. Declara una variable tipo puntero a char: por ejemplo char *ip;
Línea 32: Como se ha dicho la función regresa el dato como cadena y debería recibirla la variable que has creado antes: ip = IP(&a, &b, &c, &d);
Línea 33: puts espera que se le de una cadena, no la dirección de una función O_o . Por tanto dale la variable que guarda la cadena: puts(ip);
Línea 34: Una vez que no necesites más un elemento creado dinámicamente debes liberarlo. Hay que acostumbrarse a ello. free(ip);
Muchas gracias a los dos por responder.
He areglado eso que me habéis dicho, y ahora el código queda así, pero me da unos valores aleatorios como respuesta. No sé si es que tengo algo mal declarado o algún error en el paso por referencia.
ACTUALIZACIÓN: lo que me daba error era "ip=IP(&a,&b,&c,&d);", que debería de ser "ip=IP(a,b,c,d);".
#include <stdio.h>
#include <stdlib.h>
char *IP(int d1, int d2, int d3, int d4){
char *dir;
dir=(char*)malloc(16*sizeof(char));
sprintf(dir,"%d.%d.%d.%d",d1,d2,d3,d4);
return *dir;
}
int main(){
int a,b,c,d;
char *ip;
ip=(char*)malloc(sizeof(char));
printf("Inserte primer campo: ");
scanf("%d",&a);
printf("Inserte segundo campo: ");
scanf("%d",&b);
printf("Inserte tercer campo: ");
scanf("%d",&c);
printf("Inserte cuarto campo: ");
scanf("%d",&d);
if (a>255 || b>255 || c>255 || d>255){
printf("\nError: os datos introducidos son incorrectos");
exit(1);
}
else{
ip=IP(&a,&b,&c,&d);
puts(ip);
}
free(ip);
return 0;
}
Tienes razón, se me fue el santo al cielo, como se suele decir.