Autor
|
Tema: [C] Ayuda: introducir enteros y devolverlos como puntero (Leído 2,389 veces)
|
andie13
Desconectado
Mensajes: 29
|
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"); } else { sprintf(*dir ,"%d.%d.%d.%d",d1 ,d2 ,d4 ,d4 ); } return dir; } main(){ int a,b,c,d; *IP(a,b,c,d); return(0); }
|
|
|
En línea
|
|
|
|
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)
|
|
|
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
Mensajes: 1.603
|
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);
|
|
|
En línea
|
|
|
|
andie13
Desconectado
Mensajes: 29
|
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: "); printf("Inserte segundo campo: "); printf("Inserte tercer campo: "); printf("Inserte cuarto campo: "); if (a>255 || b>255 || c>255 || d>255){ printf("\nError: os datos introducidos son incorrectos"); } else{ ip=IP(&a,&b,&c,&d); } return 0; }
|
|
« Última modificación: 26 Noviembre 2016, 21:20 pm por andie13 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Tienes razón, se me fue el santo al cielo, como se suele decir.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[AYUDA] Cómo puedo concatenar un char a un puntero de chars?
Programación C/C++
|
papita5
|
8
|
6,798
|
19 Octubre 2011, 20:39 pm
por papita5
|
|
|
Como detectar un desbordamiento de enteros
Programación C/C++
|
kutcher
|
4
|
2,780
|
24 Agosto 2014, 22:26 pm
por NOB2014
|
|
|
Lenguaje C:apuntador a arreglo de enteros y arreglo de apuntadores a enteros.
Programación C/C++
|
NOB2014
|
2
|
2,718
|
27 Noviembre 2015, 12:59 pm
por NOB2014
|
|
|
Note 7 quema a niño de seis años; Samsung urge a usuarios devolverlos ya
Noticias
|
wolfbcn
|
0
|
1,282
|
12 Septiembre 2016, 21:46 pm
por wolfbcn
|
|
|
Lista circular simple de enteros con 1 puntero
Programación C/C++
|
Beginner Web
|
6
|
2,175
|
6 Octubre 2018, 08:29 am
por Beginner Web
|
|