разбить строку и сохранить в массиве массивов - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть следующий фрагмент кода (который разделяет строку разделителем)

void explode(const char *input, const char *delim)
{
    char *local = strdup(input);

    char *token;

    while ((token = strtok_r(local, delim, &local))) {
        puts(token);
    }
}

Вместо того, чтобы распечатывать строки, я бы хотел, чтобы они были сохранены в массиве массивов.Я немного новичок в более продвинутых концепциях, я получаю слишком много segfaults в течение нескольких часов.Что бы вы сделали в такой ситуации?

1 Ответ

0 голосов
/ 16 сентября 2018

Вы заранее не знаете размер массива, поэтому вам следует инициализировать его до некоторого фиксированного разумного размера (скажем, 16?) И сохранить индексную переменную, чтобы указывать на следующий доступный слот в массиве для хранения следующей переменной. Если индексная переменная становится равной размеру массива, вам нужно использовать realloc, чтобы выделить больше памяти и обновить переменную размера. Продолжайте перераспределять, пока не закончите со строкой. Вот некоторый псевдокод:

size_t array_size = 16;
size_t index = 0;
char **arr = malloc(array_size * sizeof(char *));
while ((token = strtok_r(local, delim, &local))) {
        if (index == array_size) {
            array_size += 16;
            arr = realloc(arr, array_size * sizeof *arr);
            /* add error check */
        }  
        arr[index++] = token;
}

Вы должны убедиться, что освободили выделенную память, как только закончите.

...