Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/03/2006, 10:14
MaxExtreme
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
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.