Динамически изменяющийся массив строк. Как?

Тема в разделе "Arduino & Shields", создана пользователем Vir, 17 июл 2014.

  1. Vir

    Vir Гик

    День добрый.

    Вернулся к разработке проекта на Arduino, и столкнулся с проблемой. Мне необходимо сделать динамически изменяющийся массив строк. Что бы было понятнее, объясню, что я хочу получить.

    Есть функцию, на вход которой передаётся строка. Строка разбивается, например, по пробелу. И каждой кусок строки кладется в массив. Ну, и понятное дело, функция этот массив строк возвращает.

    Какие проблемы?
    1. Мы изначально не знаем, на сколько кусков раздробится строка. Во всяком случае я не нашёл возможности "из коробки" посчитать количество символов в строке.
    2. Исходя из пункта один, мы не можем заранее указать размер массива в который кладутся строки.
    Вот код, в том виде, в котором есть сейчас:
    Код (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.
     
  2. Unixon

    Unixon Оракул Модератор

    1) цикл по строке, сравнение с символом-разделителем, подсчет совпадений, исключение повторных разделителей;
    2) массив выделяется динамически после подсчета разделителей.
     
  3. Vir

    Vir Гик

    С циклом по строке - ясно. Это первое, что приходит на ум. Но... дважды проходить циклом по одной и той же строке - похоже на костыль =(
     
  4. Unixon

    Unixon Оракул Модератор

    Возвращайте массив через аргумент.

    int splitString(String source, char separator, char***target)
    {
    }

    Выделение памяти под результат внутри функции разбиения строки на подстроки.
     
  5. Unixon

    Unixon Оракул Модератор

    Тогда возвращайте не массив, а односвязный список.
     
  6. Vir

    Vir Гик

    Можно подробнее? Я не силен в программирование на C =(
     
  7. Unixon

    Unixon Оракул Модератор

    struct str_list_item
    {
    char *str;
    str_list_item *next;
    };

    Выделяете такие кусочки по одному и цепляете их через указатели.
     
  8. Unixon

    Unixon Оракул Модератор

    Можно двусвязный список сделать:

    struct str_list_item
    {
    char *str;
    str_list_item *prev;
    str_list_item *next;
    };

    Если следующего\предыдущего элемента не существует, в prev/next пишем 0 (нуль), либо доподлинно не валидный константный указатель.
     
  9. Unixon

    Unixon Оракул Модератор

    std::list что ли посмотрите...
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

  11. Unixon

    Unixon Оракул Модератор

  12. Megakoteyka

    Megakoteyka Оракул Модератор

    А обязательно возвращать сразу все куски? Нельзя просто поочередно их обработать? Тогда и с динамикой не придется возиться.
     
  13. Максимус-Бог

    Максимус-Бог Убийца матрёшек

  14. AlexU

    AlexU Гуру

    Строку, которая на вход подаётся, можно изменять или нет? Т.е. будет ли она использоваться в первоначальном виде дальше по логике или её нужно разбить и о первоначальном виде можно забыть?

    PS: С классом String нужно быть по аккуратнее...