Подтвердить что ты не робот

С++ boost split string

Я использую метод 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 (tab).

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

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

to

cout << *it << endl;

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Что произошло, машина на самом деле напечатала это:

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

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