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.

Dividiendo una cadena dinámica larga en una matriz de cadenas en c.

Soy bastante nuevo en C y no puedo entender por qué esta función no funciona consistentemente en absoluto:

char **splitString(char *string) {
    char *token = strtok(string, ","), **finalValue = NULL, **temp = NULL;
    size_t wordIndex = 0;
    while (token != NULL) {
        temp = realloc(finalValue, sizeof(char *));
        if (!temp) {
            freeArray(finalValue);
            finalValue = NULL;
            break;
        }
        temp[wordIndex] = malloc((strlen(token)+1)*sizeof(char));
        if (temp[wordIndex] == NULL) {
            freeArray(finalValue);
            finalValue = NULL;
            break;
        }
        strcpy(temp[wordIndex], token);
        printf("%s\n", temp[wordIndex]);
        finalValue = temp;
        printf("%s\n", finalValue[wordIndex]);
        wordIndex++;
        token = strtok(NULL, ",");
    }
    return finalValue;
}

Recibe una cadena separada por comas y se supone que las divide en diferentes cadenas, todas las cuales fueron creadas mediante malloc/realloc.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con esta función es que solo reasigna memoria para un elemento a la vez, en lugar de asignar memoria para toda la cadena. La línea temp = realloc(finalValue, sizeof(char *)) solo reasigna memoria para un char*, en lugar de reasignar memoria para wordIndex+1 char*. Esto significa que cada vez que se ejecuta el bucle, se reasigna memoria para un elemento, lo que significa que se pierde la memoria anterior. Para solucionar esto, puedes cambiar la línea a temp = realloc(finalValue, sizeof(char *)*(wordIndex+1)); para que reasigne memoria para todos los elementos en el arreglo finalValue.

Comments are closed.