Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

В чем ошибка алгоритма?

#c


Алгоритм должен возвращать двумерный массив с разделенной по пробелу строкой (тот
же split(" ") из Python). 

#include 
#include 
#include 

// Добавление char в конец массива char
void append(char* needed, char to_append) {
    int length = strlen(needed);
    needed[length] = to_append;
    needed[length+1] = '\0';
}


char** split(char* input) {
    int space_count = 0;

    // Считаем пробелы
    for (int i = 0; i < strlen(input); i++) {
        if (input[i] == ' ') {
            space_count++;
        }
    }

    // Указатель на указатель на char.
    char **splitted_input;
    // Выделяем память под массивы char
    splitted_input = (char**) malloc((space_count+1) * sizeof(*splitted_input));

    // Хранилище для текущей строки (перед пробелом)
    char word[100] = "";
    int current = 0;

    for (int i = 0; i < strlen(input); i++) {
        if (input[i] == ' ') {
            printf("NEW: [%d] = %s\n", current, word);
            splitted_input[current] = word;
            current++;
            // Обнуляем весь массив
            memset(word, 0, sizeof(word));
            continue;
        }

        // Если не пробел, то добавляем в конец word новый символ
        append(word, input[i]);
    }


    printf("NEW: [%d] = %s\n\n", current, word);
    // Добавляем текущую строку
    splitted_input[current] = word;

    for (int i = 0; i < space_count+1; i++) {
        printf("%s\n", splitted_input[i]);
    }


    // Еще не имею понятия, как здесь лучше освободить память splitted_input
    return splitted_input;
}



int main() {
    char input[20] = "hi everyone";

    char** need = split(input);

    return 0;
}


Выводит:

NEW: [0] = hi
NEW: [1] = everyone

everyone
everyone


Не понимаю, почему splitted_input[0] тоже равняется everyone
    


Ответы

Ответ 1



Непосредственный ответ на вопрос: они оба указывают на один и тот же word. Другая проблема: из функции возвращается массив с указателями на локальную переменную. Решение. Для splitted_input[current] выделяйте память на новую строку, куда копируйте содержимое word: splitted_input[current] = strdup(word);

Ответ 2



splitted_input[current] = word; На каждой итерации цикла указатель splitted_input[current] ставится на один и тот же массив word. Разумеется будет выводиться одна и та же строка, если все указатели указывают в одно и то же место.

Комментариев нет:

Отправить комментарий