Foro de elhacker.net

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.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *IP(int d1, int d2, int d3, int d4){
  5.    char *dir;
  6.  
  7.    dir=(char*)malloc(sizeof(char));
  8.    if (d1>255 || d2>255 || d3>255 || d4>255){
  9.        sprintf(*dir,"Error: os datos introducidos son incorrectos");
  10.        exit(1);
  11.    }
  12.    else {
  13.        sprintf(*dir,"%d.%d.%d.%d",d1,d2,d4,d4);
  14.    }
  15.  
  16.    return dir;
  17. }
  18.  
  19.  
  20. main(){
  21.    int a,b,c,d;
  22.  
  23.    printf("Inserte 1 campo: ");
  24.    scanf("%d",&a);
  25.    printf("Inserte 2 campo: ");
  26.    scanf("%d",&b);
  27.    printf("Inserte 3 campo: ");
  28.    scanf("%d",&c);
  29.    printf("Inserte 4 campo: ");
  30.    scanf("%d",&d);
  31.  
  32.    *IP(a,b,c,d);
  33.    puts(*IP);
  34.  
  35.    return(0);
  36. }


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:

Código:
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);".

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. char *IP(int d1, int d2, int d3, int d4){
  6.    char *dir;
  7.  
  8.    dir=(char*)malloc(16*sizeof(char));
  9.  
  10.    sprintf(dir,"%d.%d.%d.%d",d1,d2,d3,d4);
  11.    return *dir;
  12. }
  13.  
  14.  
  15. int main(){
  16.    int a,b,c,d;
  17.    char *ip;
  18.  
  19.    ip=(char*)malloc(sizeof(char));
  20.  
  21.    printf("Inserte primer campo: ");
  22.    scanf("%d",&a);
  23.    printf("Inserte segundo campo: ");
  24.    scanf("%d",&b);
  25.    printf("Inserte tercer campo: ");
  26.    scanf("%d",&c);
  27.    printf("Inserte cuarto campo: ");
  28.    scanf("%d",&d);
  29.  
  30.    if (a>255 || b>255 || c>255 || d>255){
  31.        printf("\nError: os datos introducidos son incorrectos");
  32.        exit(1);
  33.    }
  34.    else{  
  35.        ip=IP(&a,&b,&c,&d);
  36.        puts(ip);
  37.    }
  38.    free(ip);
  39.    return 0;
  40. }


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.