elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Ayuda: introducir enteros y devolverlos como puntero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Ayuda: introducir enteros y devolverlos como puntero  (Leído 2,113 veces)
andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
[C] Ayuda: introducir enteros y devolverlos como puntero
« 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. }


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [C] Ayuda: introducir enteros y devolverlos como puntero
« Respuesta #1 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)


En línea

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


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Ayuda: introducir enteros y devolverlos como puntero
« Respuesta #2 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);


En línea

andie13

Desconectado Desconectado

Mensajes: 29


Ver Perfil
Re: [C] Ayuda: introducir enteros y devolverlos como puntero
« Respuesta #3 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. }
« Última modificación: 26 Noviembre 2016, 21:20 pm por andie13 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Ayuda: introducir enteros y devolverlos como puntero
« Respuesta #4 en: 27 Noviembre 2016, 00:20 am »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines