Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: andie13 en 26 Noviembre 2016, 19:35 PM

Título: [C] Ayuda: introducir enteros y devolverlos como puntero
Publicado por: andie13 en 26 Noviembre 2016, 19:35 PM
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);
}
Título: Re: [C] Ayuda: introducir enteros y devolverlos como puntero
Publicado por: engel lex en 26 Noviembre 2016, 19:42 PM
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)
Título: Re: [C] Ayuda: introducir enteros y devolverlos como puntero
Publicado por: MAFUS en 26 Noviembre 2016, 20:11 PM
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);


Título: Re: [C] Ayuda: introducir enteros y devolverlos como puntero
Publicado por: andie13 en 26 Noviembre 2016, 21:04 PM
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;
}
Título: Re: [C] Ayuda: introducir enteros y devolverlos como puntero
Publicado por: MAFUS en 27 Noviembre 2016, 00:20 AM
Tienes razón, se me fue el santo al cielo, como se suele decir.