При преобразовании строки в 2d массив первый элемент поврежден - PullRequest
0 голосов
/ 31 января 2019

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

Вот код.Я GDBed и попробовал без строк ключа, и это все еще не удается.count_letters и count_words просто перебирают указанный указатель, пока не найдут ключ или не подсчитают все ключи, соответственно.

char **str_to_dp(char const *str, char const key)
{
    char **arr = malloc(sizeof(*arr) * (count_words(str, key) + 1));
    int i = 0;

    if (!arr)
        perror("get_PATH");
    for (int j = 0, word = 0; str[j]; j++, i++, word = 0) {
        while (str[j] == key)
            j++;
        arr[i] = malloc(count_letters(str + j, key) * sizeof(char));
        if (!arr[i])
            perror("get_PATH");
        while (str[j] != key)
            arr[i][word++] = str[j++];
    }
    arr[i] = 0;
    return arr;
}

При печати arr[i] внутри цикла и когда GDB-код еще внутрицикл, первый элемент остается в порядке.Всякий раз, когда я пытаюсь напечатать (скажем, с циклом непосредственно перед возвратом), я получаю случайные значения для первой строки (а иногда и второй, если в строке достаточно элементов).Есть идеи, почему?

Спасибо, что прочитали.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Кроме того, что сказал @dgnuff, похоже, моя проблема была вне функции.Я преобразовал массив (char **) в (char const *) вместо (char const **).

0 голосов
/ 31 января 2019

Попробуйте пошагово в gdb.Основная проблема заключается в том, что всякий раз, когда вы достигнете нижней части цикла for, str[j] == key будет истинным.Если ключ не равен '\0', тест str[j] всегда будет успешным, и ваш цикл for уйдет с конца массива.

Вам нужно либо посчитать слова в цикле for, чем работать до str[j] == 0 или измените цикл while в конце цикла for, чтобы while (str[j] != key && str[j]) в качестве теста.

...