#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. Разумеется будет выводиться одна и та же строка, если все указатели указывают в одно и то же место.
Комментариев нет:
Отправить комментарий