Devolver cadena con función

Iniciado por Kaxperday, 5 Agosto 2014, 22:39 PM

0 Miembros y 2 Visitantes están viendo este tema.

Kaxperday

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



#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.
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

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
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

Cita de: Kaxperday en  5 Agosto 2014, 22:39 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

leosansan

Vamos que :

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
char* CreaNombre(char *nombre);

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

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
  for ( i = 0 ; i < 13 ; i++ )
    nombre [ i ] = ( 48 + rand ( ) % ( 57 - 48 ) + 1 ) ;
    nombre[i] = '\0' ;


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

Código (cpp) [Seleccionar]
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! ..... !!!!



Eternal Idol

char *nombre ya esta en el main y todo ese codigo no explica el problema en lo mas minimo.
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

#5
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.
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

Cita de: Kaxperday en  6 Agosto 2014, 00:47 AMedito: 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 ...
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


* Lo que comentaba en mi mensaje.
Cita de: Eternal Idol en  6 Agosto 2014, 00:57 AM
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?.

Cita de: Eternal Idol en  6 Agosto 2014, 00:41 AM

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


Cita de: Kaxperday en  6 Agosto 2014, 00:47 AM

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! ..... !!!!