Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como crear una función que me debuelba una cadena

Estas en el tema de Como crear una función que me debuelba una cadena en el foro de C/C++ en Foros del Web. Esto es lo que ise pero no funciona. char pcname() { char p[20]; char *n; printf("Entre pc: "); n = gets( p ); return p; ...
  #1 (permalink)  
Antiguo 08/03/2006, 09:42
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 8 meses
Puntos: 2
Como crear una función que me debuelba una cadena

Esto es lo que ise pero no funciona.

char pcname()
{
char p[20];
char *n;
printf("Entre pc: ");
n = gets( p );
return p;
}
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #2 (permalink)  
Antiguo 08/03/2006, 10:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Tienes varios problemas, lógicos y en los que todos hemos caido al empezar con C:

Código:
char pcname() // Una cadena es "char *", no "char"
{
    char p[20];
    char *n; // ¿Para qué usas "n"?
    printf("Entre pc: ");
    n = gets( p ); // ¿Para qué usas "n"
    return p; // NO debes devolver "char p[20]", porque es una variable local
}
Te explico: No hace falta recoger el valor que devuelve gets(). gets() necesita 1 parámetro (char *) que es donde guardará la cadena, y cuando termina, lo que hace es devolver ese mismo parámetro. Es decir: Después de "n = gets(p);", "n" y "p" son exactamente lo mismo. Por tanto, con escribir "gets(p)" es suficiente.

El problema "gordo": No debes hacer "return p;". Esto puede ser confuso.

Cuando empieza la función, el compilador ha dejado sitio para p[20] (20 bytes en concreto). Después, tú escribes la cadena, y la escribe en p[20]. Hasta ahí bien. Pero tú devuelves p. ¿Qué ocurre al salir de la función? El compilador ha dejado código que destruye a "p". Por tanto, aunque hagas return p; estás copiando un puntero a un lugar que no existe (aunque te funcione, puede que no lo haga, y en el momento que vuelvas a hacer pcname() seguro que no funcionará).

Por tanto, la función, bien escrita te la dejo aquí. Se puede hacer una función que use memoria dinámica (que es como se debe hacer), pero para no complicarte, usa el código como te pongo:

Código:
void pcname(char * p)
{
    puts("Introducir pc: ");
    gets(p);
}

int main()
{
    char nombre1[100];
    char nombre2[100];

    pcname(nombre1);
    pcname(nombre2);

    /* prueba */
    printf("nombre1: %s\nnombre2: %s\n\n",nombre1,nombre2);

    return 0;
}
Ten en cuenta que por ahora ese código te puede servir, pero enseguida verás que usar arrays para cadenas que tenga que introducir el usuario es la cosa más peligrosa que existe. Tal cual está el código que te he escrito, es víctima fácil de un hackeo.
  #3 (permalink)  
Antiguo 08/03/2006, 11:01
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 8 meses
Puntos: 2
grasias max. estupenda tu explicación.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #4 (permalink)  
Antiguo 08/03/2006, 12:59
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por VisualGuallabo
grasias max. estupenda tu explicación.
De nada y gracias :D Espero no haberte confundido más.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:22.