Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 5 Agosto 2014, 22:39 pm



Título: Devolver cadena con función
Publicado por: Kaxperday 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.


Título: Re: Devolver cadena con función
Publicado por: Eternal Idol 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


Título: Re: Devolver cadena con función
Publicado por: Blaster 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


Título: Re: Devolver cadena con función
Publicado por: leosansan 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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Devolver cadena con función
Publicado por: Eternal Idol 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.


Título: Re: Devolver cadena con función
Publicado por: Kaxperday 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.


Título: Re: Devolver cadena con función
Publicado por: Eternal Idol 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 ...


Título: Re: Devolver cadena con función
Publicado por: leosansan 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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)