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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Devolver una cadena pasada como argumento a una funcion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Devolver una cadena pasada como argumento a una funcion  (Leído 3,161 veces)
eduu15

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Devolver una cadena pasada como argumento a una funcion
« en: 9 Abril 2018, 01:26 am »

Citar
tengo este code y el problema es que solo me imprime una h
Código:
#include <stdio.h>

char imprimir_cadena(const char *cadena2);

int main(){

   const char *ptr="hola";

   const char *p=imprimir_cadena(ptr);

   printf("%s",&p);

   return 0;

}

char imprimir_cadena(const char *cadena2){

    return *cadena2; //el asterico * es opcional?


}

Citar
Y porque este funciona?
Código:
#include <stdio.h>

char imprimir_cadena(const char *cadena2);

int main(){

   const char *ptr="hola";

   const char *p=imprimir_cadena(ptr);

   printf("%s",(&p)[1]); //esta parte no la entiendo

   return 0;

}

char imprimir_cadena(const char *cadena2){

    return cadena2;


}


« Última modificación: 9 Abril 2018, 02:34 am por eduu15 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Devolver una cadena pasada como argumento a una funcion
« Respuesta #1 en: 9 Abril 2018, 01:43 am »

Unos pequeños cambios.

Código
  1. #include <stdio.h>
  2.  
  3. char* imprimir_cadena(const char *cadena2);
  4.  
  5. int main(){
  6.    const char *ptr="hola";
  7.    const char *p=imprimir_cadena(ptr);
  8.    printf("%s", p); // cuando se imprimen cadenas no se usa asterisco
  9. }
  10.  
  11. char* imprimir_cadena(const char *cadena2){ // nota que el tipo de dato devuelto es char*
  12.    return cadena2; //el asterico * es opcional? No, no debe estar
  13. }


En línea

eduu15

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Devolver una cadena pasada como argumento a una funcion
« Respuesta #2 en: 9 Abril 2018, 01:56 am »

Gracias
En línea

eduu15

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Re: Devolver una cadena pasada como argumento a una funcion
« Respuesta #3 en: 9 Abril 2018, 02:32 am »

Modifique la pregunta añadi otro codigo que creo que funciona de suerte pero funciona
« Última modificación: 9 Abril 2018, 02:37 am por eduu15 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Devolver una cadena pasada como argumento a una funcion
« Respuesta #4 en: 9 Abril 2018, 03:18 am »

El segundo está mal hecho porque genera desbordamiento.
Devuelves un puntero (tipo de dato de 4 u 8 bytes, según arquitectura) sobre un char (tipo de dato de 1 byte).

Por qué funciona
Código:
printf("%s",(&p)[1]);

Esta parte depende de como el compilador sitúa las variables en la memoria.
Te recomiendo que visites esto: http://www2.elo.utfsm.cl/~lsb/elo320/clases/c3.pdf

La explicación rápida es:
C ha situado ptr y p de forma contigua. Tu has hecho que ptr apunte a la cadena "hola" y mediante la función p también apuntará a "hola" (pero esa parte está mal hecha como ya te he dicho, hay desbordamiento por la diferencia de bytes entre los tipos de datos). Cuándo le das (&p)[1] a printf en verdad le estas dando ptr.

%s necesita un puntero, p es un puntero, se lo podrías así, sin florituras. Pero le has añadido [1], supongo que lo has hecho y te ha marcado error, eso es porqué lo has dereferenciado y accedido al segundo carácter. En este momento el programa ha transformado el código ascii de 'o' y se lo ha dado a printf para que busque en esa posición de memoria (la 111 en decimal) para que busque allí una cadena pero el S.O. no le ha dejado y por eso ha fallado.
Seguramente para arreglarlo habrás dicho 'pues transformo p en un puntero dándole incluyendo el operador de dirección (el &)'. Pero no has quitado el [1] y esto a generado lo siguiente:
Con & has conseguido la dirección de p, es decir su puntero, y al usar los corchetes lo has dereferenciado. Si hubieras usado (&p)[0] habrías conseguido p que se lo habrías pasado a printf y habría mostrado la cadena por p, pero al mover el offset 1 byte con el [1] (se ha movido 1 byte porqué p es un puntero a char) has apuntado a la variable ptr, que es contigua. Como se ha dereferenciado, por lo comentado antes, printf la ha aceptado y por el hecho de que apunta a la misma cadena parece que el programa ha funcionado.

En verdad lo que has tenido es mucha suerte. Por eso, y para evitarte estos errores e ir moviéndote a ciegas por el tema de los punteros léete el PDF que te he pasado.

P.D.: Siguiendo con lo que te dije el otro día sobre lo de editar los posts: Si hay respuesta de otra persona sigue en una respuesta nueva. Solo edita el mismo post si vas a añadir algo pero nadie te ha respondido.
« Última modificación: 9 Abril 2018, 03:19 am por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
funcion como argumento a otra funcion
Programación C/C++
Dark Invader 5 4,826 Último mensaje 29 Junio 2011, 20:52 pm
por Dark Invader
Devolver puntero a cadena en función
ASM
silver2050 2 2,840 Último mensaje 22 Mayo 2013, 00:31 am
por silver2050
Como devolver puntero con cadena vacia
Programación C/C++
Destro- 6 3,529 Último mensaje 17 Marzo 2014, 22:30 pm
por Eternal Idol
Devolver cadena con función
Programación C/C++
Kaxperday 7 3,184 Último mensaje 6 Agosto 2014, 05:55 am
por leosansan
Puntero a funcion como argumento
Programación C/C++
_Enko 4 2,616 Último mensaje 10 Enero 2015, 16:25 pm
por Yoel Alejandro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines