Autor Tema: Funcion que lee cadenas de caracteres  (Leído 2846 veces)

Desconectado pac0_pepe

  • Newbie
  • *
  • Mensajes: 2
Funcion que lee cadenas de caracteres
« en: 20 de Julio de 2005, 11:53:57 pm »
Hola a todos. Soy nuevo en el foro y casi nuevo en esto de la programacion en C. Tengo una pequeña duda que me tiene un poco loco desde hace unos dias. El caso es que he implementado una función que lee cadenas de texto de un fichero que se encuentren encerradas entre dobles comillas. La función es la siguiente (soy novato, puede que haya errores :wink:):

char* LeerCadena (FILE *fichero) {
   
    static char cadena [512];
    char *ptr = cadena;
    char c = ' ';
   
    while (c == ' ')     /*Salta los blancos hasta llegar a " */
        fscanf (fichero, "%c", &c);
   
    *ptr++ = c;
    c = ' ';

    while (c != '"') { /* Va metiendo caracteres hasta llegar a "*/
        fscanf (fichero, "%c", &c);
        *ptr++ = c;
    }
    *ptr = '\0';
    return cadena;
}

Pues bien, con esto se me plantean un par de dudas:

Si la variable cadena NO la declaro como static, el compilador me da un warning diciendo que lo que me va a devolver la función es la dirección de una variable local.

Si lo dejo tal y como está, y llamo a la función varias veces seguidas, es decir:

char *uno, *dos, *tres;

uno = LeerCadena (Fichero);
dos = LeerCadena (Fichero);
tres = LeerCadena (Fichero);

y después llamo a otra función con esos parámetros:

void funcion (uno, dos, tres);

lo que recibe la función en todos los parametros es lo que haya almacenado en la variable "tres" ¿Alguien sabe como solucionarlo?

No se si me he explicado bien y perdón por el post porque es un poco largo. Si alguien me pudiese ayudar le estaria muy agradecido. Gracias por vuestro tiempo.
Un saludo.

Desconectado shicefgo

  • Member
  • ***
  • Mensajes: 166
Funcion que lee cadenas de caracteres
« Respuesta #1 en: 21 de Julio de 2005, 01:03:46 pm »
Problemillas con los punteros ¿eh? :)

Las variables locales existen únicamente durante el tiempo de ejecución de la función que las contiene, excepto las declaradas como static, cuyo contenido permanece entre llamadas a la función. Si un puntero local se destruye al finalizar la función, lógicamente la variable que apuntaba a su dirección apuntará a cualquier sitio desconocido. El compilador te avisa de esto.

Prueba, en lugar de copiar la dirección del puntero utilizando el '=' , a copiar el contenido de la variable utilizando strcpy o, mejor, strncpy, ya que el signo '=' obtiene la dirección del puntero, y el contenido de ésta cambia cada vez que llamas a la función, por eso te encuentras los mismos datos en todas las variables, porque todas tienen la misma dirección de memoria. Es decir, que tendrías que declarar a uno, dos y tres como arrays de caracteres del mismo tamaño que cadena. Yo pondría ese valor en un #define:

#define LONGCAD 512

static char cadena[LONGCAD];

char uno[LONGCAD], dos[LONGCAD], tres[LONGCAD];

Por cierto, sería aconsejable que, al utilizar strncpy, el parámetro de la longitud contenga ésta menos uno, es decir, 511 para este ejemplo. Esto es para asegurarle el sitio al carácter de fin de cadena.

Salu2.

Desconectado pac0_pepe

  • Newbie
  • *
  • Mensajes: 2
Funcion que lee cadenas de caracteres
« Respuesta #2 en: 21 de Julio de 2005, 06:23:51 pm »
Muchisimas gracias shicefgo parece ser que los punteros siempre nos traen de cabeza a los novatos  :?
Probare tu solución y ya te comento los resultados.
Un saludo!

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License