我试着在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;
}
答案 0 :(得分:3)
substr
的第二个参数是大小,而不是位置。而不是这样称呼它:
testStr.substr(prevLoc, loc-1);
试试这个:
testStr.substr(prevLoc, loc-prevLoc);
一旦你解决了这个问题,你将遇到的下一个问题就是你没有打印最后一个子字符串,因为一旦你找不到换行符就停止了。因此,从最后一个换行到字符串结尾的点不会被存储。