Разделение строки c++ std:: с помощью токенов, например "; " [дубликат]


лучший способ разделить строку в C++? Можно предположить, что строка состоит из слов, разделенных разделителем ;.

С нашей точки зрения направляющих линий строковые функции C не допускаются, а также Boost также не разрешается использовать из-за проблем безопасности open source не допускается.

лучшее решение у меня есть это:

string str("denmark;sweden;india;us");

выше strдолжны храниться в векторе в виде строк. как мы можем достичь это?

Спасибо за входы.

3 58
c++

3 ответа:

найти std::getline() часто простейших. Необязательный параметр-разделитель означает, что он предназначен не только для чтения "строк":

#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);
    }
}

вы можете использовать строковый поток и считывать элементы в вектор.

здесь есть много различных примеров...

копия одного из примеров:

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;
}

существует несколько библиотек, решающих эту проблему, но самый простой, вероятно, использовать 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";
}