С++ 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;
И казалось, что "-------"
каким-то образом покрыл первую строку.
Ответы
Ответ 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, но вы не заметили бы, что потому что они уже были тире).