Problema con Malloc y cadenas de tamaño variable.

Iniciado por samur88, 22 Noviembre 2010, 12:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Garfield07

Pseucode:

1. Pedir cadena =  char *tmp, fgets (...)
2. Calcular tamaño = strlen ()
3. Reservar memoria = malloc
4. Borrar tmp [x ejemplo metiendo paso 1 en funcion aparte....


Algo asi???


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Eternal Idol

¿Y a char *tmp que tamaño le damos? Estamos en la misma y usando memoria dinamica dos veces para nada ...

Yo lo haria mas o menos asi:

void getString(char **pstr)
{
  char tmp[16384];
  fgets(tmp, sizeof(tmp), stdin);
  *pstr = (char*)malloc(strlen(tmp) + 1);
  strcpy(*pstr, tmp);
}


Primero reservas memoria para los punteros y despues con un bucle llamas a esta funcion pasandole la direccion de cada elemento del array de punteros a char.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

do-while

¡Buenas!

Tambien puedes asignar la memoria seguna vayas leyendo caracteres:


int main(int argc, char *argv[])
{
    char *cadenas[N_CADENAS],lector;
    int i,ncaracteres;

    for(i = 0 ; i < N_CADENAS ; i++)
    {
        cadenas[i] = NULL;
        ncaracteres = 0;

        while((lector = getchar() != '\n')
        {
            cadenas[i] = (char*) realloc(cadenas[i] , (ncaracteres + 2) sizeof(char));

            cadenas[ncaracteres] = lector;
            cadenas[ncaracteres + 1] = '\0';

            ncaracteres++;
        }
    }
}


Eso si, este codigo puede dar errores si no se consigue asignar la memoria, corrige eso y listo.

¡Saludos!

PD: Es codigo lo he puesto mientras lo pensaba, asi que puede tener errores. Si los hay, no creo que sean dificiles de detectar y corregir.
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

samur88

Muchas gracias por todas las respuestas, siento no haber podido contestar antes, he estado de exámenes y he tenido problemas con el ISP de internet y por eso no lo hice antes, ya por suerte se ha arreglado todo.

Tu idea de la variable temporal la tendré muy en cuenta, realmente si pongo un numero muy grande no creo que una cadena llegue a tener mas de ese numero y luego con realloc podría disminuirla a lo que ocupa la cadena.

Una pregunta, la idea de leer carácter por carácter es mas lento que el algoritmo propuesto por Eternal Idol de la variable temporal?

Y una ultima cosa, realmente la cadena en C no se almacena hasta que se pulsa enter, ¿no hay una forma de que cuando pulse enter todo lo que este en studin o en la entrada de datos que internamente el sistema operativo administra sacar los caracteres que han sido leídos en esa entrada y con ese tamaño darle el valor a la cadena?

Un saludo y gracias de nuevo.