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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Devolver cadena con función
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Devolver cadena con función  (Leído 2,169 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Devolver cadena con función
« en: 5 Agosto 2014, 22:39 pm »

Bueno este tema es un clásico, pero no consigo devolver la cadena o no la muestra haber si sabéis algo:

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* crenombre();

int main()
{
    char *nombre=NULL;
    nombre=creanombre();
    printf(":%s.",nombre);
}

char* creanombre()
{
    int i;
    char nombre[100];
    srand(time(NULL));
    for(i=0;i<13;i++)
    {
        nombre[i]=(48+rand()%(57-48)+1);
    }
    return nombre;
}


El programa no muestra el nombre en el prinf que puede fallar? Gracias.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.790


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Devolver cadena con función
« Respuesta #1 en: 5 Agosto 2014, 23:06 pm »

char nombre[100]; esta en la pila y su ambito es la funcion creanombre.

VC++ avisa:
n.cpp(24) : warning C4172: returning address of local variable or temporary


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Devolver cadena con función
« Respuesta #2 en: 5 Agosto 2014, 23:19 pm »

El programa no muestra el nombre en el prinf que puede fallar? Gracias.

La razón es que nombre es una variable local de la función creanombre  al terminar la ejecución de la mencionada función la dirección que ocupaba la variable en ella es liberada y por tanto el valor que se había almacenado en ella se pierde.

Saludos
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Devolver cadena con función
« Respuesta #3 en: 6 Agosto 2014, 00:14 am »

Vamos que :

Código
  1. char *nombre ;

debe ir en main con el consiguiente cambio en la función y en su invocación ya que ahora tiene un parámetro que pasar (nombre):

Código
  1. char* CreaNombre(char *nombre);

Tampoco viene mal hacer una cierta reserva de memoria para nombre, tipo:

Código
  1. nombre =  malloc ( 100 * sizeof ( char ) ) ;

Ya puestos, ¿que tal si "cierras" la cadena nombre con el caracter nulo no sea que imprima cosas raras:

Código
  1.  for ( i = 0 ; i < 13 ; i++ )
  2.    nombre [ i ] = ( 48 + rand ( ) % ( 57 - 48 ) + 1 ) ;
  3.    nombre[i] = '\0' ;

Y si lo que deseas es tan sólo imprimir puedas hacer:

Código
  1. printf ( ":%s." , CreaNombre ( nombre ) ) ;

Tampoco vendría mal colocar el srand al comienzo del programa y terminar main con el return correspondiente, así como incluir la librería time.h en lugar de la string.h que aquí no hace nada, a no ser que el código que cuelgas sea parte de otro más completo.  :)

¡¡¡¡ Saluditos! ..... !!!!


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.790


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Devolver cadena con función
« Respuesta #4 en: 6 Agosto 2014, 00:41 am »

char *nombre ya esta en el main y todo ese codigo no explica el problema en lo mas minimo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Devolver cadena con función
« Respuesta #5 en: 6 Agosto 2014, 00:47 am »

1000 gracias tema solucionado, puse un simple malloc como dijo leosansan y se solucionó, para pasar un puntero hay que declarar un puntero no una cadena, la cadena se pierde el puntero se devuelve la cadena no xD.

edito: es probable que no hayáis entendido nada jaja yo ya me entiendo.
« Última modificación: 6 Agosto 2014, 00:53 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.790


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Devolver cadena con función
« Respuesta #6 en: 6 Agosto 2014, 00:57 am »

edito: es probable que no hayáis entendido nada jaja yo ya me entiendo.

Ciertamente; mientras comprendas que era un problema del ambito de la variable que intentabas retornar ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Devolver cadena con función
« Respuesta #7 en: 6 Agosto 2014, 05:55 am »


* Lo que comentaba en mi mensaje.
Ciertamente; mientras comprendas que era un problema del ámbito de la variable que intentabas retornar ...

* Lo que indiqué en mi mensaje, ponerlo en main, ¿hace falta decir que "sólo" cuando ya lo han comentado en dos intervenciones anteriores?.

* Y de paso recordarle que tiene que pasar la función con el argumento de "nombre". ¿O no?.


 todo ese codigo no explica el problema en lo mas mínimo.



1000 gracias tema solucionado, puse un simple malloc como dijo leosansan y se solucionó..................xD.




* Prueba sin malloc.

* ¿Sin el caracter nulo final una cadena?.

* Y sólo quedó el detalle de la impresión, que como comenté era una opción si solo quería imprimir.

Sin acritud, que no estoy para batallitas.  ;)

¡¡¡¡ Saluditos! ..... !!!!




En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
devolver valor de uan funcion
Programación C/C++
mapers 1 1,904 Último mensaje 15 Noviembre 2010, 05:14 am
por Mr.Blue
Cadena estatica al devolver puntero de cadena.
Programación C/C++
alem29 2 2,392 Último mensaje 5 Febrero 2012, 23:38 pm
por eleon
Devolver puntero a cadena en función
ASM
silver2050 2 1,776 Último mensaje 22 Mayo 2013, 00:31 am
por silver2050
Como devolver puntero con cadena vacia
Programación C/C++
Destro- 6 2,515 Último mensaje 17 Marzo 2014, 22:30 pm
por Eternal Idol
Devolver una cadena pasada como argumento a una funcion
Programación C/C++
eduu15 4 2,110 Último mensaje 9 Abril 2018, 03:18 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines