2010-08-26 44 views
7

我想为CPP字符串使用字符串Tokenizer,但我能找到的只是Char *。 有没有类似的CPP字符串?用于CPP字符串的字符串标记器?

+17

怎么样从下面的例子:http://www.codeproject.com/KB/recipes/Tokenizer。 aspx他们非常高效,有点优雅。字符串工具包库使得C++中的复杂字符串处理变得简单和容易。 – 2010-12-08 05:31:13

+0

[使用strtok与std :: string](http://stackoverflow.com/questions/289347/using-strtok-with-a-stdstring) – bobobobo 2013-03-05 19:00:59

回答

7

你所说的“令牌”是什么意思?如果这件事情被任何空白分离,字符串流是你想要什么:

std::istringstream iss("blah wrxgl bxrcy") 
for(;;) { 
    std::string token; 
    if(!(iss>>token)) break; 
    process(token); 
} 
if(!iss.eof()) report_error(); 

另外,如果你在寻找一个特定单一分隔符,你可以用std::getline(iss,token,sep_char)取代iss>>token

如果一个以上的字符可以作为分隔符(如果不是空格),则可以使用std::string::find_first()std::string::substr()的组合。

+1

+1替代方案 – Chubsdad 2010-08-26 09:59:04

+0

有没有什么好的理由比'while'(iss >> token)'更好'(假设'token'是在循环之前声明的)?在这个例子中,它会缩短一行,并且在我看来,至少不会降低可读性。 – 2010-08-26 10:55:09

+0

@ Space_C0wb0y:(我现在只理解你的评论,至少我认为我是这样做的)。我恰好喜欢在while循环的简洁性上使用更多的局部变量。 – sbi 2010-09-03 11:29:41

0

退房STL交易算法像find_first_offind_first_not_of等创建一个自定义的。

0

试试这个片段,我发现某处(甚至在这里?):

#include <string> 
#include <vector> 
#include <sstream> 

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while(std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    return split(s, delim, elems); 
}