сбой токенайзера строки - PullRequest
       4

сбой токенайзера строки

1 голос
/ 12 декабря 2011

Ниже описано, как я использую строковый токенизатор.

typedef std::string                      string_t;
typedef std::vector<string_t>            stations_t;

void Tokenize(const string_t& str, stations_t& tokens,const string_t& delimiters = " ") {
    string_t::size_type lastPos = str.find_first_not_of(delimiters, 0);
    string_t::size_type pos     = str.find_first_of(delimiters, lastPos);
    while (string_t::npos != pos || string_t::npos != lastPos){
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        lastPos = str.find_first_not_of(delimiters, pos);
        pos = str.find_first_of(delimiters, lastPos);
    }
}

Когда я передаю строку 1,8003,1,HWH,Kolkata Howrah Junction,,16:10,,1,0, она возвращает мне 8 поля, где, как и должно возвращаться 9он полностью игнорирует ,, часть.Может кто-нибудь, пожалуйста, посмотрите и помогите мне найти ошибку здесь.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

В приведенном вами примере вам нужно пустое поле между "16:10" и "1", верно?

Причина, по которой вы его не получаете, заключается в том, что когда вы получили подстроку«16:10», тогда pos равно 43, и вы ищете символ, которого нет в строке разделителя, начиная с этой позиции.Первый символ без разделителя - «1» в позиции 45.

Я предлагаю что-то вроде этого:

void Tokenize2(const string_t& str, stations_t& tokens,const string_t& delimiters = " ") {
    string_t::size_type elem_start = 0;
    string_t::size_type elem_end  = str.find_first_of(delimiters, 0);
    while (elem_start != string_t::npos && elem_end != string_t::npos) {
        tokens.push_back(str.substr(elem_start, elem_end - elem_start));
        elem_start = str.find_first_of(delimiters, elem_end) + 1;
        elem_end   = str.find_first_of(delimiters, elem_start);
    }

    if (elem_start != string_t::npos) {
        // Get the last element
        tokens.push_back(str.substr(elem_start, elem_end - elem_start));
    }
}
1 голос
/ 12 декабря 2011

Ошибка в вашей логике поиска токена.

lastPos = str.find_first_not_of(delimiters, 0);
pos     = str.find_first_of(delimiters, lastPos);

Обычно вы пытаетесь найти символ, который не является разделителем, и присваиваете ему lastPos , затем вы продолжаете находить первый разделитель после lastPos и присваиваете ему pos и захватите все между lastPost и pos , чтобы быть токеном. По сути, попытка найти find_first_not_of пропустит любые последовательные разделители. Вы можете использовать тестовый вход

,,,,,,,,22,

и вы обнаружите, что первая итерация находит токен 22 * ​​1020 * и пропускает все подряд "," с

Как мне токенизировать строку в C ++? имеет множество способов написать токенизатор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...