es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Asignación de memoria para arreglo de cadenas

Necesito analizar un archivo csv. Creo un array de strings y asigno memoria para eso.
El primer ciclo while(fgets(line,100,fp) tiene éxito, pero cuando entra en el segundo, los valores son sobreescritos por los datos de line.

while (fgets(line, 100, fp))
{
    num_of_string++;
    code = (char **)realloc(code, sizeof(char *) * (num_of_string));
    occupation = (char **)realloc(occupation, sizeof(char *) * (num_of_string));
    num_of_ppl = (char **)realloc(num_of_ppl, sizeof(char *) * (num_of_string));

    char * column = strtok(line, ",");
    code[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
    code[num_of_string-1] = column;
    counter++;
    while (column)
    {
        if (counter == 1)
        {
            column = strtok(NULL, "\"");
            occupation[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
            occupation[num_of_string-1] = column;
            counter++;
            column = strtok(NULL, ",");
        } else if (counter == 2) {
            num_of_ppl[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
            num_of_ppl[num_of_string-1] = column;
            counter++;
            column = strtok(NULL, ",");
        } else {
            column = strtok(NULL, ",");
            counter++;
        }
    }
    counter = 0;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c y asignación de memoria, sugeriría modificar el código para evitar el problema de que los valores sean sobrescritos por los datos de la línea. Una posible solución es asignar memoria para cada cadena por separado y copiar los datos de la línea en el espacio asignado. Esto se puede lograr utilizando la función strcpy de la siguiente manera:

    while (fgets(line, 100, fp))
    {
        num_of_string++;
        code = (char **)realloc(code, sizeof(char *) * num_of_string);
        occupation = (char **)realloc(occupation, sizeof(char *) * num_of_string);
        num_of_ppl = (char **)realloc(num_of_ppl, sizeof(char *) * num_of_string);
    
        char * column = strtok(line, ",");
    
        code[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
        strcpy(code[num_of_string-1], column);
    
        counter++;
        while (column)
        {
            if (counter == 1)
            {
                column = strtok(NULL, ",");
                occupation[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
                strcpy(occupation[num_of_string-1], column);
                counter++;
                column = strtok(NULL, ",");
            } else if (counter == 2) {
                num_of_ppl[num_of_string-1] = malloc(sizeof(char) * (strlen(column)+1));
                strcpy(num_of_ppl[num_of_string-1], column);
                counter++;
                column = strtok(NULL, ",");
            } else {
                column = strtok(NULL, ",");
                counter++;
            }
        }
        counter = 0;
    }
    

    En este código modificado, se asigna memoria para cada cadena utilizando la función malloc, y los datos de la línea se copian en el espacio asignado utilizando strcpy. Esto ayuda a evitar el problema de que los valores sean sobrescritos por los datos de la línea.

Comments are closed.