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<char>
的构造函数需要 const char*
作为参数。如果我写TokenizerSeparator separator(delim);
,它不会编译
@Alexandre,很可能它需要"null-terminated string"
,而不是单个字符。
如example 所示,boost::char_separator<char> sep("-;|");
@DavidSchwartz,谢谢,我还没有使用过 boost,所以我开始假设了。
这里是 char_separator template <typename Char, typename Tr = BOOST_DEDUCED_TYPENAME std::basic_string<Char>::traits_type > class char_separator ...
的模板定义所以它想要一个字符。【参考方案2】:
感谢@DavidSchwartz 的回答(参见上面的 cmets)。
char_separator 在其构造函数中需要一个有效的 C 字符串。
【讨论】:
以上是关于boost tokenizer 的随机行为的主要内容,如果未能解决你的问题,请参考以下文章