Почему не работает строковый токенизатор c ++ - PullRequest
1 голос
/ 28 декабря 2011

Я пытался написать простой токенайзер std :: string на c ++, и я не могу заставить его работать правильно.Я нашел один онлайн, который работает , и я понимаю, почему он работает .... но я все еще не могу понять, почему мой оригинальный не работает .Я предполагаю, что это какая-то глупая маленькая вещь, которую мне не хватает ... Я был бы признателен за указатель в правильном направлении;спасибо!

ввод (случайный символ и символы с символом "\ n", \ t "):

"This is a test string;23248h> w chars, aNn, 8132; ai3v2< 8&G,\nnewline7iuf32\t2f,f3rgb, 43q\nefhfh\nu2hef, wew; wg"

токенизатор:

size_t loc, prevLoc = 0;
while( (int)(loc = theStr.find_first_of("\n", prevLoc) ) > 0) {
    string subStr = theStr.substr(prevLoc, loc-1);        // -1 to skip the \n
    cout << "SUBSTR: '" << subStr << "'" << endl << endl;
    tokenizedStr->push_back( subStr );
    prevLoc = loc+1;
} // while

вывод:

SUBSTR: 'This is a test string;23248h> w chars, aNn, 8132; ai3v2< 8&G'

SUBSTR: 'newline7iuf32  2f,f3rgb, 43q
efhfh
u2hef, wew; wg'

SUBSTR: 'efhfh
u2hef, wew; wg'

Обратите внимание, что во втором "SUBSTR" (по-видимому) по-прежнему есть символы новой строки ("\ n")

Скомпилированный код:

#include <vector.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {

    string testStr = "This is a test string;23248h> w chars, aNn, 8132; ai3v2< 8&G,\nnewline7iuf32\t2f,f3rgb, 43q\nefhfh\nu2hef, wew; wg";
    vector<string> tokenizedStr;

    size_t loc, prevLoc = 0;
    while( (int)(loc = testStr.find_first_of("\n", prevLoc) ) > 0) {
        string subStr = testStr.substr(prevLoc, loc-1);        // -1 to skip the \n                                                                                                     
        cout << "SUBSTR: '" << subStr << "'" << endl << endl;
        tokenizedStr.push_back( subStr );
        prevLoc = loc+1;
    } // while                                                                                                                                                                        

    return 0;
}

1 Ответ

3 голосов
/ 28 декабря 2011

Второй аргумент substr - это размер, а не местоположение.Вместо того, чтобы называть это так:

testStr.substr(prevLoc, loc-1);

Попробуйте это:

testStr.substr(prevLoc, loc-prevLoc);

Как только вы это исправите, следующая проблема, с которой вы столкнетесь, это то, что вы не печатаете последнюю подстроку,потому что вы останавливаетесь, как только вы не найдете новую строку.Таким образом, от точки последней новой строки до конца строки не сохраняется.

...