Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ Парсить string с использованием разделителя.

Автор: Dima2387 6.11.2015, 12:48

Привет. Имею нужду парсить строку вида

node1;node2;node3;node4
a1=node1;
a2=node2;
a3=node3;
a4=node4;
нужно распаршивать строку учитывая что разделитель ; Нашел вот такой кусочек чуть модифицировал под себя однако проблема в следующем - если в одном из блоков будет пробел, данные в переменную запишутся только до первого пробела в блоке :(

std::string socket_parsing(std::string &s) {
//   std::string str = "ФИО String; Дата_рождения Date; Кол-во Integer; Рейтинг Float";
    std::string nickname;

//    std::vector<std::string> types;
   std::vector<std::string> titles;
   const std::string delimeters = ";";
   for (std::string::iterator iter = s.begin(); iter != s.end(); ++iter)
   {
      if (delimeters.find(*iter) != std::string::npos)
      {
         *iter = '\n';
      }
   }
   std::istringstream ist(s);
   while (std::getline(ist, s))
   {
      std::istringstream tmp(s);
      std::string type;
      std::string title;
      tmp >> title >> type;
//      types.push_back(type);
      titles.push_back(title);
   }
   int i=1;
   for (std::vector<std::string>::iterator ti_iter = titles.begin();
        ;++ti_iter, i++)
   {

      if ( i == 1 )
      std::cout<<*ti_iter<<" nickname \n";

       if ( i == 2 )
       std::cout<<*ti_iter<<" message \n";

   }
return s;
}


Если у кого есть время помочь буду благодарен)

Автор: Влад 6.11.2015, 15:03

vector<string> tokenize(const string& str, const string& delimiters = " ")
{
    vector<string> result;

    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    string::size_type pos = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        result.push_back(str.substr(lastPos, pos - lastPos));
        lastPos = str.find_first_not_of(delimiters, pos);
        pos = str.find_first_of(delimiters, lastPos);
    }
    return result;
}

Автор: Dima2387 6.11.2015, 17:02

Благодарю за ответ. Проверю сегодня и отпишусь.

Автор: Iron Bug 6.11.2015, 20:47

почему бы не использовать обычный http://en.cppreference.com/w/cpp/string/byte/strtok? он как раз это самое делает. а перегнать всё полученное в вектор или ещё куда - это всегда без проблем.

Автор: Dima2387 7.11.2015, 1:07

Спасибо Влад, спасибо Iron Bug. Я написал свой велик. К сожалению еще не знаю что такое вектор, поэтому не совсем понимаю механизм работы того куска что я показал в первом посте и того что продоставил Влад. Вот такую функцию я сделал. Показываю ее в виде отдельного приложения так как так было проще тестить

"Код"
#include <iostream>
#include <string>

int main ()

{
    int polozenie_razdelitelya;

    int message_l;

    std::string nick;

    std::string message;

    std::string str ("Test ty; privet, eto test, test; razdelitelej v tom 4isle");

    std::string delim =";";

    int l=str.length();

    for (int i=0; i<l; ++i)


    {

        if (str[i] == delim[0])

        {

        polozenie_razdelitelya=i;

        break;

        }

    }

    for (int j=0; j<polozenie_razdelitelya; j++)

    {

        nick += str[j];

    }


    for (int y=polozenie_razdelitelya+1; y<l;y++)

    {

        message += str[y];

    }


    std::cout<<nick<<" - nick" <<"\n";

    std::cout<<message<<" - message"<<"\n";



  return 0;

}

Автор: Iron Bug 8.11.2015, 11:34

рекомендую ознакомиться с форматированием постов. на форуме есть теги для кода.
P.S. приведённый код лучше никому не показывать. изучай основы языка вместо строительства велосипедов с квадратными колёсами. причём начни с изучения основ С по работе с массивами и строками.

Автор: Влад 9.11.2015, 11:04


ОФФ:


Вот велосипеды попрошу не трогать!

Цитата
Квадратными колесами может свернуть совершенно гладко, если дорога имеет равномерно шишки в виде серии перевернутой цепной кривых. Колес может быть любой правильный многоугольник за исключением треугольник, но надо использовать правильную контактных сетей, соответствующих правильно формы и размеров колес.


(ПыСы: это гуглопереводчик из статьи о catenary curve.)


Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)