函数strtok中的分隔符序列

sequence of delimiters in function strtok

本文关键字:分隔符 strtok 函数      更新时间:2023-10-16

我试图在c++中获得函数strtok()的令牌。是非常简单的,当你只使用一个分隔符:token = strtok(auxiliar,"[,]");。这将在每次函数找到[, ,]时削减auxiliar

我想要的是获得带有一系列分隔符的令牌,如:[,]有可能这样做与strtok功能?我找不到路。

谢谢!

如果您希望strtok[,]视为一个单个令牌,则不能这样做。strtok总是将传入的任何分隔符字符串视为单独的1个字符的分隔符。

除此之外,最好不要在c++中使用strtok。它不是可重入的(例如,你不能嵌套调用),不是类型安全的,而且非常容易使用,从而产生讨厌的bug。

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

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

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

如果可以使用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++

如果你可以使用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'