函数strtok中的分隔符序列

时间:2011-11-16 14:38:18

标签: c++ delimiter strtok

我试图在C ++中获得具有函数strtok()的标记。当你只使用1个分隔符时非常简单: token = strtok(auxiliar,"[,]");。每当函数找到auxiliar[,时,这将会]

我想要的是获取具有一系列分隔符的令牌,例如:[,]strtok函数可以做到这一点吗?我找不到路。

谢谢!

4 个答案:

答案 0 :(得分:2)

如果您希望strtok[,]视为单个令牌,则无法执行此操作。 strtok始终将分隔符字符串中传递的任何内容视为单个1个字符的分隔符。

除此之外,最好不要在C ++中使用strtok。它不是可重入的(例如,你不能嵌套调用),不是类型安全的,并且非常容易以一种产生令人讨厌的错误的方式使用。

最简单的解决方案是在循环中简单地使用std::string搜索所需的特定分隔符。如果您需要更复杂的功能,Boost库中有标记器,我还发布了代码,仅使用标准库here进行更全面的标记化。

我上面链接的代码也将分隔符视为单个字符,但我认为代码可以按照您希望的方式进行扩展。

答案 1 :(得分:1)

如果这是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;
}

答案 2 :(得分:0)

如果您可以使用新的C ++ 11功能,则可以使用regex和token迭代器来完成。例如:

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的书籍Professional C ++。

答案 3 :(得分:-1)

如果你可以使用升级库,我认为这会做你想做的事情 - 不完全确定,但你的问题有点不清楚

#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'