为什么c ++字符串标记生成器不起作用

时间:2011-12-28 00:23:13

标签: c++ string tokenize

我试着在c ++中编写一个简单的std :: string tokenizer,但我无法让它正常工作。我发现一个的网上工作,我明白为什么它可以工作....但我仍然无法弄清楚为什么我原来的工作。我假设它有一些我丢失的愚蠢的小东西......我会欣赏一个指向正确方向的指针;谢谢!

输入(带有“\ 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 个答案:

答案 0 :(得分:3)

substr的第二个参数是大小,而不是位置。而不是这样称呼它:

testStr.substr(prevLoc, loc-1);

试试这个:

testStr.substr(prevLoc, loc-prevLoc);

一旦你解决了这个问题,你将遇到的下一个问题就是你没有打印最后一个子字符串,因为一旦你找不到换行符就停止了。因此,从最后一个换行到字符串结尾的点不会被存储。