boost tokenizer 的随机行为

Posted

技术标签:

【中文标题】boost tokenizer 的随机行为【英文标题】:Random behavior of boost tokenizer 【发布时间】:2012-06-10 23:26:32 【问题描述】:

我的 boost tokenizer 有问题,这是我的代码:

#include <iostream>
#include <vector>
#include <boost/tokenizer.hpp>

using namespace std;

static vector<std::string> tokenize(const std::string& input, const char delim) 
    std::cout << "Tokenize: " << input << std::endl;
    vector<std::string> vector;
    typedef boost::char_separator<char> TokenizerSeparator;
    typedef boost::tokenizer<TokenizerSeparator> Tokenizer;
    TokenizerSeparator separator(&delim);
    Tokenizer tokenizer(input, separator);
    Tokenizer::iterator iterator;

    for(iterator=tokenizer.begin(); iterator!=tokenizer.end();++iterator)
        std::cout << "elem found: " + *iterator << std::endl;
        vector.push_back(*iterator);
    
    return vector;


int main(int argc, const char * argv[])

    string input = "somedata,somedata,somedata-somedata;more data;more data";
    vector<string> list = tokenize(input, ';');

    return 0;

此代码的行为并非始终一致。有时它有效,有时在多次运行时无效。当它在这里不起作用时,我得到一个输出:

Tokenize: somedata,somedata,somedata-somedata;more data;more data
elem found: some
elem found: ata,some
elem found: ata,some
elem found: ata-some
elem found: ata
elem found: more 
elem found: ata
elem found: more 
elem found: ata

我做错了什么?

谢谢。

【问题讨论】:

【参考方案1】:
TokenizerSeparator separator(&delim);

您正在根据字符存储的地址而不是字符的值进行标记。

【讨论】:

char_separator&lt;char&gt; 的构造函数需要 const char* 作为参数。如果我写TokenizerSeparator separator(delim);,它不会编译 @Alexandre,很可能它需要"null-terminated string",而不是单个字符。 如example 所示,boost::char_separator&lt;char&gt; sep("-;|"); @DavidSchwartz,谢谢,我还没有使用过 boost,所以我开始假设了。 这里是 char_separator template &lt;typename Char, typename Tr = BOOST_DEDUCED_TYPENAME std::basic_string&lt;Char&gt;::traits_type &gt; class char_separator ... 的模板定义所以它想要一个字符。【参考方案2】:

感谢@DavidSchwartz 的回答(参见上面的 cmets)。

char_separator 在其构造函数中需要一个有效的 C 字符串。

【讨论】:

以上是关于boost tokenizer 的随机行为的主要内容,如果未能解决你的问题,请参考以下文章

toke过期失效 ---提示并跳转到登录页面

CSRF攻击预防的Token生成以及验证原理

字符串迭代器不兼容 boost::tokenizer

Boost::tokenizer 逗号分隔 (c++)

Boost.Tokenizer 用于引号和括号

boost::tokenizer 考虑分隔符之间没有标记