Привет. Имею нужду парсить строку вида
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;
}
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;
}
Благодарю за ответ. Проверю сегодня и отпишусь.
почему бы не использовать обычный http://en.cppreference.com/w/cpp/string/byte/strtok? он как раз это самое делает. а перегнать всё полученное в вектор или ещё куда - это всегда без проблем.
Спасибо Влад, спасибо 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;
}
рекомендую ознакомиться с форматированием постов. на форуме есть теги для кода.
P.S. приведённый код лучше никому не показывать. изучай основы языка вместо строительства велосипедов с квадратными колёсами. причём начни с изучения основ С по работе с массивами и строками.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)