День добрый. Вернулся к разработке проекта на Arduino, и столкнулся с проблемой. Мне необходимо сделать динамически изменяющийся массив строк. Что бы было понятнее, объясню, что я хочу получить. Есть функцию, на вход которой передаётся строка. Строка разбивается, например, по пробелу. И каждой кусок строки кладется в массив. Ну, и понятное дело, функция этот массив строк возвращает. Какие проблемы? Мы изначально не знаем, на сколько кусков раздробится строка. Во всяком случае я не нашёл возможности "из коробки" посчитать количество символов в строке. Исходя из пункта один, мы не можем заранее указать размер массива в который кладутся строки. Вот код, в том виде, в котором есть сейчас: Код (Text): char* io_parse_command(String string) { char* result[]; int space_position = 0; String piece = ""; while (string.length() > 0) { space_position = string.indexOf(" "); if (space_position > 0) { piece = string.substring(0, space_position); string = string.substring(space_position + 1, string.length()); space_position = string.indexOf(" "); } else { piece = string; string = ""; } } return *result; } Необходимо при каждой итерации (while) наполнять массив result значениями piece.
1) цикл по строке, сравнение с символом-разделителем, подсчет совпадений, исключение повторных разделителей; 2) массив выделяется динамически после подсчета разделителей.
С циклом по строке - ясно. Это первое, что приходит на ум. Но... дважды проходить циклом по одной и той же строке - похоже на костыль =(
Возвращайте массив через аргумент. int splitString(String source, char separator, char***target) { } Выделение памяти под результат внутри функции разбиения строки на подстроки.
struct str_list_item { char *str; str_list_item *next; }; Выделяете такие кусочки по одному и цепляете их через указатели.
Можно двусвязный список сделать: struct str_list_item { char *str; str_list_item *prev; str_list_item *next; }; Если следующего\предыдущего элемента не существует, в prev/next пишем 0 (нуль), либо доподлинно не валидный константный указатель.
https://www.ozon.ru/context/detail/id/4788523/ https://www.ozon.ru/context/detail/id/5531965/ https://www.ozon.ru/context/detail/id/24021059/ https://www.ozon.ru/context/detail/id/1335648/ https://www.ozon.ru/context/detail/id/2527041/ https://www.ozon.ru/context/detail/id/2527036/
А обязательно возвращать сразу все куски? Нельзя просто поочередно их обработать? Тогда и с динамикой не придется возиться.
Строку, которая на вход подаётся, можно изменять или нет? Т.е. будет ли она использоваться в первоначальном виде дальше по логике или её нужно разбить и о первоначальном виде можно забыть? PS: С классом String нужно быть по аккуратнее...