即時嘗試獲取函數strtok()
在C++中的標記。當您使用1個分隔符時非常簡單: token = strtok(auxiliar,"[,]");
。每當函數發現[
,,
或]
時,這將會削減auxiliar
。函數分隔符的序列strtok
我想要的是獲得一系列分隔符的令牌,如:[,]
用strtok
函數可以這樣做嗎?我找不到路。
謝謝!
即時嘗試獲取函數strtok()
在C++中的標記。當您使用1個分隔符時非常簡單: token = strtok(auxiliar,"[,]");
。每當函數發現[
,,
或]
時,這將會削減auxiliar
。函數分隔符的序列strtok
我想要的是獲得一系列分隔符的令牌,如:[,]
用strtok
函數可以這樣做嗎?我找不到路。
謝謝!
如果你可以使用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'
將任何字符'[,]'視爲分隔符,而不是序列'[,]'。 –
無論如何我無法使用外部庫:( – Urien
@Urien - 恥辱 - 增強是有用的 - 它只是一個頭文件這個:-) –
如果您想strtok
將[,]
作爲單個令牌,則無法完成此操作。 strtok
始終將您在分隔符字符串中傳遞的任何內容視爲單個1字符分隔符。
除此之外,最好不要在C++中使用strtok
。它不可重入(例如,不能嵌套調用),不是類型安全的,並且非常容易使用,從而產生令人討厭的錯誤。
最簡單的解決方案是在一個循環中簡單搜索一個std::string
作爲你想要的特定分隔符。如果您需要更復雜的功能,則Boost庫中存在分詞器,並且我還發布了代碼,以便僅使用標準庫here進行更全面的分詞。
我上面鏈接的代碼也將分隔符當作單個字符,但我認爲代碼可以按照您的需要進行擴展。
呵呵,我想這正是我想要的。我會馬上嘗試。謝謝!!!!!! – Urien
如果您可以使用新的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++。
如果這真的是C++,你應該使用std :: string而不是C字符串。
下面是僅使用STL分裂的例子的std::string
成std::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;
}
你的意思是要在分隔符的數組來傳遞,並有'對任何一個strtok'記號化他們? –
其實,不,看起來你的意思是相反的。你想'strtok'把'[,]'當作**單個分隔符嗎? –
只是不要在C++中使用C字符串和'strtok',因爲它只是有太多的陷阱而且具有破壞性。使用'string'和'find'。 –