2010-08-26 45 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); 
}