На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Обработка строки
    Всем доброго времени суток, есть задача обработать строку и преобразовать ее в вектор, функция принимает саму строку, символ который является разделителем. в результате должен выйти вектор, то-есть вот пример:
    char *s = "aabc:bbc:czsc";
    char **vec = func(s,':');
    где func - функция принимающая параметры (char *s, char b), char b - символ разделитель.
    И в результате вектор должен стать таким
    aabc'\0'bbc'\0'czsc'\0'
    Я так понял что нужно искать в строке символ разделитель и заменять его на null-terminated, думал как-то так
    ExpandedWrap disabled
        for (int i = 0; i < strlen(s); s++)
      {
         if (s[i] = ':')
         {
            //вот что тут делать не могу понять
         }
      }
      Судя по примеру, тебе надо не преобразовать исходный вектор, а создать новый вектор векторов. Соответственно, надо сначала посчитать количество строк, затем выделить количество памяти под нужное количество char*, и после этого инизиализировать каждый из этих указателей.
      Цитата skinex @
      i < strlen(s)

      strlen вычисляет длину, проходя по всей строке. Поэтому тут надо вычислить её один раз заранее, а не считать на каждой итерации.
        Смотри тут (если конечно у тебя не строгое студенческое задание):

        ExpandedWrap disabled
          #include <iostream>
          #include <algorithm>
          #include <iterator>
          #include <regex>
           
          int main() {
            std::string Text = "111:222:333";
            std::regex RegExp(":");
            std::vector<std::string> Vector = {};
            // заполняем вектор
            std::copy(std::sregex_token_iterator(Text.begin(), Text.end(), RegExp, -1),
                      std::sregex_token_iterator(),
                      std::back_inserter(Vector));
            // печатаем вектор
            for(const auto &i:Vector) std::cout << i << "\n";
            return 0;
          }
        Сообщение отредактировано: JoeUser -
          Спасибо, изящное решение, но желательно решать без использования STL.
            Цитата skinex @
            Я так понял что нужно искать в строке символ разделитель и заменять его на null-terminated, думал как-то так

            наверное лучше сделай с копированием строк, а потом модифицируй так как тебе надо.
            вообще легкая задачка, откуда она? :D
            Сообщение отредактировано: Cfon -
              Работает, например, так:
              ExpandedWrap disabled
                char **
                func(char *a, char c)
                {
                    char **s, *aa=a;
                    int k=0;
                    while( a=strchr( a, c) ) k++,a++;
                    s = new char*[k+1];
                    a = aa, k=0;
                    while( aa=strchr( a, c) )
                        memcpy( s[k]=new char[aa-a+1], a,(int)(aa-a)), s[k++][aa-a]=0, a = aa+1;
                    strcpy( s[k]=new char[strlen(a)+1], a);
                    return s;
                }
                JoeUser, использовать regex в этом задании это как их пушки по воробьям. find + substr более чем достаточно.

                Добавлено
                skinex, исходную строку можно менять?

                Добавлено
                Задача по с или си++?
                  Цитата shm @
                  JoeUser, использовать regex в этом задании это как их пушки по воробьям. find + substr более чем достаточно.

                  Тяжелое наследие Perl'а :lol: На нем прогаю с 1997 года, на Цэ++ присел (более-менее) плотно с 2012года.
                  Ты просто обязан меня понять :lol:
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0321 ]   [ 16 queries used ]   [ Generated: 2.05.24, 18:54 GMT ]