[C] Ayuda: introducir enteros y devolverlos como puntero

Iniciado por andie13, 26 Noviembre 2016, 19:35 PM

0 Miembros y 1 Visitante están viendo este tema.

andie13

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);
}

engel lex

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)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

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);



andie13

#3
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;
}

MAFUS

Tienes razón, se me fue el santo al cielo, como se suele decir.