C ++ Boost Split String - PullRequest
       16

C ++ Boost Split String

48 голосов
/ 20 апреля 2011

Я использую метод boost::split, чтобы разделить строку следующим образом:

Сначала я обязательно включу правильный заголовок, чтобы иметь доступ к boost::split:

#include <boost/algorithm/string.hpp>

затем:

vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

и строка выглядит как

"test   test2   test3"

Вот как я получаю вектор строки результата:

void printstrs(vector<string> strs)
{
    for(vector<string>::iterator it = strs.begin();it!=strs.end();++it)
    {
        cout << *it << "-------";
    }

    cout << endl;
}

Но почему в результатеstrs Я получаю только "test2" и "test3", не должно быть "test", "test2" и "test3", в строке \t (табуляция).

Обновлено 24 апреля 2011 года: Казалось, после того, как я изменил одну строку кода в printstrs, я вижу первую строку.Я изменил

cout << *it << "-------";

на

cout << *it << endl;

И казалось, что "-------" как-то перекрывает первую строку.

Ответы [ 2 ]

69 голосов
/ 20 апреля 2011

Проблема в другом месте вашего кода, потому что это работает:

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i++)
    cout << strs[i] << endl;

и тестирование вашего подхода, использующего векторный итератор, также работает:

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;
for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it)
{
    cout << *it << endl;
}

Опять вашПроблема в другом.Может быть, то, что вы считаете символом \t в строке, не так.Я бы заполнил код отладками, начав с контроля вставок в векторе, чтобы убедиться, что все вставляется так, как должно быть.

Вывод:

* size of the vector: 3
test
test2
test3
12 голосов
/ 28 августа 2012

Мое лучшее предположение о том, почему у вас возникли проблемы с -----, покрывающим ваш первый результат, заключается в том, что вы фактически прочитали строку ввода из файла. Эта строка, вероятно, имела в конце \ r, поэтому вы получили что-то вроде этого:

-----------test2-------test3

То, что случилось, - машина на самом деле напечатала это:

test-------test2-------test3\r-------

Это означает, что из-за возврата каретки в конце test3 черточки после test3 печатались поверх первого слова (и нескольких существующих черточек между test и test2, но вы не заметите потому что они уже были тире).

...