PreguntasLinux

Versión Completa: Regresar una cadena de una funcion
Actualmente estas viendo una versión simplificada de nuestro contenido. Para ver la versión completa en el formato correcto, dale click aquí
Hola buenas tardes tengan todos aqui les vengo con un problemita mas, programando en C me tope con la necesidad de regresar una cadena de una funcion es decir el sig ejemplo:

char funcion(char var)
{char var1[20]="hola";
char var2[20];
strcat(var,var2);
strcat(var2,var);
return var2;
}

entonces mi problema es ke me marca warning al compilar me dice:
warning: return makes integer from pointer without a cast
warning: function returns address of local variable

otro problema es que al querer atrapar el valor que regresa la funcion con una variable, ejemplo
int main()
{
char variable[20];
variable=funcion();
return 0;
}
me marca el siguiente:
warning: incompatible type

Por tanto noe stoy seguro si estoy regresando la cadena correctamente, alguien ha tenido este problema?? como lo resolvieron??
Muchas gracias por su atencion 1-smile
esta bien la funcion, pero mal la funcion, te falto el * en la declaracion.

Código:
char* funcion(char* var)


Con eso te deberia andar, te recuerdo que una cadena es un arreglo de chars asi que si declaras como char (sin el asterisco) estas diciendo que vas a usar UNA letra sola o numeros del 0-255 (pero esto ya es otra cosa).

Hola german gracias por tu atencion, y vale ya lo he hecho con punteros y no me marca los warning, el problema es ke funcion me tiene ke regresar una cadena que concateno en funcion, y se la tengo ke asignar a una variable para imprimirla en una pequeña impresora epson, ahora si vuelvo un valor tipo puntero "char* funcion()", al momento de asignarlo a una variable en el main me dice que los tipos son incompatibles y si deseo imprimir directo, las funciones de la impresora me marcan que no se pueden imprimir punteros... es decir ocupo ke funcion me mande una cadena, ejemplo:
char funcion()
{char var[20]="hola";
return var;
}

int main()
{char variable[20];
variable=funcion();
printf("%s",variable);// y debe imprimirme "hola" y no una direccion de memoria 0xsfd34f....
}

en funcion yo hago una serie de concatenaciones a var y deseo me regrese esas concatenaicones para imprimirlas pero como tipo caracter no como puntero, espero me puedas ayudar 1-smile saludos .
Hola german, por fin se ha logrado 1-wink, ya es posible mandar los valores ke deseaba, dejo un ejemplo:

char* funcion();

char* funcion()
{char cadena[20]="Hola";
char* puntero;
strcpy(puntero,cadena);
return puntero;}

int main()
{char* p;
p=funcion();
printf("%s",p); // imprime hola 1-grin
return 0;}

Te agradesco tu ayuda y tu atencion, este es un ejemplo base para poder mandar cadenas de una funcion a otra 1-grin
El problema ha sido resuelto muchisimas gracias. saludos 1-smile
Che, no te quiero tirar abajo... pero eso no anda, se te va a salir a la mitad del programa. Lo correcto seria esto:

Código:
#include <stdio.h>
#include <string.h>

char* funcion()
{
  char* cadena="Hola!";
  char cad2[20];
  char* puntero=cad2;
  strcpy(puntero,cadena);
  return cadena;
}

int main()
{
char* p;
p=funcion();
printf("%s",p); // imprime hola 1-grin
return 0;
}

Fijate que la funcion strcpy() toma punteros char de argumento. Tambien podes, si ya sabes cual va a ser el contenido declarar un puntero directamente asi:

Código:
char* cadena="Hola!";

De esta forma, se asigna la memoria que necesita para guardar "Hola!" y luego se le asigna un puntero, es equivalente a hacer esto en una forma mas corta...

Código:
char cadena[]="Hola";
char* puntero=cadena;


Espero que te sea de utilidad.

Edit: Perdon me mande una burrada, tenia que devolver puntero en vez de cadena.021

bueno no he tenido problemas hasta ahora con el codigo, sin embargo he hecho las modificaciones ke me sugeriste y todo funciona igual, puedes poner el mensaje como solucionado, si llegase a haber mas probelmas lo presentare en el foro 1-smile

gracias por todo 1-razz
jejejj, disculpame le mande cualquiera, para resumir, el programa podria ser a si:

Código:
#include <stdio.h>
#include <string.h>

char* funcion()
{
  char* cadena="Hola!";
  static char cad2[20];
  strcpy(cad2,cadena);
  return cad2;
}

int main()
{
char* p;
p=funcion();
printf("%s",p); // imprime hola 1-grin
return 0;
}


Lo unico que necesitas saber es que estas devolviendo un puntero, es decir, una direccion de memoria, entonces cuando se termina de ejecutar la funcion la memoria que utilizo es liberada, y el puntero es devuelto. Pero el mismo apunta a cualquier lado, ya que la memoria a la que apuntaba a sido liberada. Para solventar esto podemos hacer:

Código:
static char cad2[20];

Con 'static' le decimos al compilador que guarde la variable aunque haya terminado la funcion (seria una variable global).

Alternativamente podes hacer que la funcion tome como parametro la cadena que vas a escribir, por ejemplo:

Código:
void funcion(char* cadena){
//  codigo
}


Eso es todo, y disculpame por mariarte tanto.

URLs de Referencia