Funcion que retorne char array?

Iniciado por juancaa, 19 Julio 2012, 01:43 AM

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

juancaa

Buenas, me gustaria saber si es posible devolver un array de caracteres y como. La verdad es que he probado bastantes cosas y rebuscado en google pero no he hallado la forma de hacerlo, tal vez con punteros...

Ejemplo en codigo :
int len = 20;
char str[len];
str = read_array(len);


He probado con varias cosas y nada, no hay manera, alguien me puede ayudar con esto porfa?
Que tengas un buen dia!

DickGumshoe

¡Hola!

Para crear una función que devuelva un array de caracteres debes hacer esto:


char* devolverArray()
{
//Aquí el código de la función
return array_de_caracteres;
}

int main()
{
//Código de main()
cad = devolverArray();
//resto de código de main()


Es decir, debes indicar que vas a devolver un char*, y retornar una variable de dicho tipo.

Saludos!

juancaa

No hay manera, haber si puedes ayudarme, este es mi codigo basado en tu ejemplo:

#include <stdio.h>

char* func () {
char txt2[20];
printf("\nIntroduce word = ");
scanf("%s", &txt2);
return txt2;
}

int main () {
int len = 20;
char str[20];
str = func();
printf("\nResult = %s.", str);
return 0;
}


Error :

test.cpp: In function 'char* func()':
test.cpp:4:7: warning: address of local variable 'txt2' returned [enabled by default]
test.cpp: In function 'int main()':
test.cpp:13:13: error: incompatible types in assignment of 'char*' to 'char [20]'


En que me equivoco??
Que tengas un buen dia!

leogtz

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

char* func(void) {
char *txt2 = malloc(20);
printf("\nIntroduce word = ");
scanf("%s", txt2);
return txt2;
}

int main(void) {
int len = 20;
char *str = func();
printf("\nResult = %s.", str);
free(str);
return EXIT_SUCCESS;
}

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

avesudra

#4
Vamos a ver , estás devolviendo un puntero , a una cadena de carácteres , si todavía no sabes que son los punteros pues como indica su nombre son apuntadores¿a qué? a direcciones de memoria, entonces char tx2[20] es un puntero que puede variar 20 posiciones, como se le ha indicado , pero claro tu estás asignando un puntero que se retorna de una función , a un array de carácteres.Y eso no es así , te dejo el código corregido:

#include <stdio.h>

char* func () {
char txt2[20];
printf("\nIntroduce word = ");
scanf("%s", &txt2);
return txt2;
}

int main () {
int len = 20;
char *str; //Puntero al inicio de la variable txt2 , o sea a txt2 [0]
str = func();
printf("\nResult = %s.", str);
return 0;
}ara que te quede bien sería:
Regístrate en

rir3760

Cita de: fMtQr en 19 Julio 2012, 02:36 AM
No hay manera, haber si puedes ayudarme,

...

Error :
test.cpp: In function 'char* func()':
test.cpp:4:7: warning: address of local variable 'txt2' returned [enabled by default]
test.cpp: In function 'int main()':
test.cpp:13:13: error: incompatible types in assignment of 'char*' to 'char [20]'


En que me equivoco??
Lo primero que debes aclarar es el lenguaje de programación que estas utilizando ya que el código fuente es C pero la extensión "cpp" sugiere que es C++. ¿Cual de ellos?

Si se trata de C debes seguir la solución de Leo Gutiérrez y si se trata de C++ puedes utilizar la clase string.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

juancaa

#6
Gracias por vuestras respuestas!
Respecto al codigo de Leo Gutiérrez. me sigue dando errores de compilacion :

test.cpp: In function 'char* func()':
test.cpp:5:24: error: invalid conversion from 'void*' to 'char*' [-fpermissive]


Utilizando el metodo de avesudra logro compilar el codigo pero la salida no acaba de cuadrar :

Introduce word = casa
Result = casa╠■(.


Aunque ahora ya puedo devolver el array la salida devuelve caracteres que no se de donde salen... Alguna idea de como solucionar esto??
Muchas gracias por vuestra ayuda!!
Que tengas un buen dia!

juancaa

rir3760 tienes toda la razon en eso, la verdad es que vengo de C y no se notar muy bien la diferencia entre C y C++... Esta pregunta la verdad me ha matado! Normalmente la unica diferencia que veo entre los codigos que utilizan C y los que utilizan C++ es que utilizan otro formato de entrada/salida (el namespace std) pero como todavia no estoy habituado pues no lo uso y al ver que el compilador tragaba pues yo seguia (no me maten por esto  :-X :-X).
Sea como sea, si estubiese usando C++ creo que deberia seguir pasando el array como puntero asi que la diferencia deberia ser minima por no decir nula, o me equivoco nuevamente ?
Que tengas un buen dia!

rir3760

Si estas aprendiendo C++ deberías utilizar las facilidades que este provee como es la clase string. Si no tienes una referencia de calidad puedes utilizar la del sitio (en ingles) C plus plus.

Un ejemplo sencillo (para el caso demasiado largo) es:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

string fn(char texto[]);

int main()
{
string s;

s = fn("Esta es una cadena de prueba");
cout << s << endl;

return 0;
}

string fn(char texto[])
{
string s(texto);

return s;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

KaL3o

Lo q esta ocurriendo es que cuando mandas parametros por referencia tratandose de arrays, lo que haces es trabajar directamente con el array.

El problema aqui es q el vector esta declarado dentro de un ambito (en este caso una funcion), al terminar el ambito lo que tiene adentro se destruye o se llena de basura.

Por eso cuando devuelves la cadena por referencia (una direccion de memoria) a tu funcion main te aparece algo totalmente diferente.

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.