2011-11-16 66 views
1

即時嘗試獲取函數strtok()在C++中的標記。當您使用1個分隔符時非常簡單: token = strtok(auxiliar,"[,]");。每當函數發現[,,]時,這將會削減auxiliar函數分隔符的序列strtok

我想要的是獲得一系列分隔符的令牌,如:[,]strtok函數可以這樣做嗎?我找不到路。

謝謝!

+0

你的意思是要在分隔符的數組來傳遞,並有'對任何一個strtok'記號化他們? –

+0

其實,不,看起來你的意思是相反的。你想'strtok'把'[,]'當作**單個分隔符嗎? –

+0

只是不要在C++中使用C字符串和'strtok',因爲它只是有太多的陷阱而且具有破壞性。使用'string'和'find'。 –

回答

-1

如果你可以使用boost庫,我認爲這會做你想要它做的事情 - 沒有完全確定,雖然你的問題是有點不清楚

#include <iostream> 
#include <vector> 
#include <string> 

#include <boost/tokenizer.hpp> 

int main(int argc, char *argv[]) 
{ 
    std::string data("[this],[is],[some],[weird],[fields],[data],[I],[want],[to],[split]"); 

    boost::tokenizer<boost::char_separator<char> > tokens(data, boost::char_separator<char>("],[")); 

    std::vector<std::string> words(tokens.begin(), tokens.end()); 

    for(std::vector<std::string>::const_iterator i=words.begin(),end=words.end(); i!=end; ++i) 
    { 
     std::cout << '\'' << *i << "'\n"; 
    } 
    return 0; 
} 

這將產生以下輸出

'this' 
'is' 
'some' 
'weird' 
'fields' 
'data' 
'I' 
'want' 
'to' 
'split' 
+0

將任何字符'[,]'視爲分隔符,而不是序列'[,]'。 –

+0

無論如何我無法使用外部庫:( – Urien

+0

@Urien - 恥辱 - 增強是有用的 - 它只是一個頭文件這個:-) –

2

如果您想strtok[,]作爲單個令牌,則無法完成此操作。 strtok始終將您在分隔符字符串中傳遞的任何內容視爲單個1字符分隔符。

除此之外,最好不要在C++中使用strtok。它不可重入(例如,不能嵌套調用),不是類型安全的,並且非常容易使用,從而產生令人討厭的錯誤。

最簡單的解決方案是在一個循環中簡單搜索一個std::string作爲你想要的特定分隔符。如果您需要更復雜的功能,則Boost庫中存在分詞器,並且我還發布了代碼,以便僅使用標準庫here進行更全面的分詞。

我上面鏈接的代碼也將分隔符當作單個字符,但我認爲代碼可以按照您的需要進行擴展。

+0

呵呵,我想這正是我想要的。我會馬上嘗試。謝謝!!!!!! – Urien

0

如果您可以使用新的C++ 11功能,可以使用正則表達式和令牌迭代器來實現。例如:

regex reg("\[,\]"); 
const sregex_token_iterator end; 
string aux(auxilar); 
for(sregex_token_iterator iter(aux.begin(), aux.end(), reg); iter != end; ++iter) { 
    cout << *iter << endl; 
} 

本例來自Wrox專業版C++。

1

如果這真的是C++,你應該使用std :: string而不是C字符串。

下面是僅使用STL分裂的例子的std::stringstd::vector

#include <cstddef> 
#include <string> 
#include <vector> 

std::vector<std::string> split(std::string str, std::string sep) { 
    std::vector<std::string> vec; 

    size_t i = 0, j = 0; 
    do { 
     i = str.find(sep, j); 
     vec.push_back(str.substr(j, i-j)); 
     j = i + sep.size(); 
    } while (i != str.npos); 

    return vec; 
} 

int main() { 
    std::vector<std::string> vec = split("This[,]is[[,]your, string", "[,]"); 
    // vec is contains "This", "is[", "your, string" 

    return 0; 
}