Разделение С++ std::string с использованием токенов, например. ";"
Возможный дубликат:
Как разбить строку в C++?
Лучший способ разбить строку в C++? Можно предположить, что строка состоит из слов, разделенных;
С нашей точки зрения, строковые функции C не разрешены, а также не разрешено использовать Boost, так как из соображений безопасности открытый исходный код запрещен.
Лучшее решение, которое у меня есть сейчас:
строка str ("Дания; Швеция; Индия; США");
Выше str следует хранить в векторе как строки. Как мы можем достичь этого?
Спасибо за вклад.
Ответы
Ответ 1
Я считаю, std::getline()
часто является самым простым. Необязательный параметр delimiter означает, что он предназначен не только для чтения "строк":
#include <sstream>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> strings;
istringstream f("denmark;sweden;india;us");
string s;
while (getline(f, s, ';')) {
cout << s << endl;
strings.push_back(s);
}
}
Ответ 2
Вы можете использовать поток строк и считывать элементы в вектор.
Здесь много разных примеров...
Копия одного из примеров:
std::vector<std::string> split(const std::string& s, char seperator)
{
std::vector<std::string> output;
std::string::size_type prev_pos = 0, pos = 0;
while((pos = s.find(seperator, pos)) != std::string::npos)
{
std::string substring( s.substr(prev_pos, pos-prev_pos) );
output.push_back(substring);
prev_pos = ++pos;
}
output.push_back(s.substr(prev_pos, pos-prev_pos)); // Last word
return output;
}
Ответ 3
Существует несколько библиотек, разрешающих эту проблему, но наиболее простым, вероятно, является использование Boost Tokenizer:
#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <boost/foreach.hpp>
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
std::string str("denmark;sweden;india;us");
boost::char_separator<char> sep(";");
tokenizer tokens(str, sep);
BOOST_FOREACH(std::string const& token, tokens)
{
std::cout << "<" << *tok_iter << "> " << "\n";
}