错误的分词
Erroneous tokenizing
我有这样的代码:
#include <boost/tokenizer.hpp>
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
int main() {
using namespace std;
boost::char_separator<char> sep(",");
string s1 = "hello, world";
tokenizer tok1(s1, sep);
for (auto& token : tok1) {
cout << token << " ";
}
cout << endl;
tokenizer tok2(string("hello, world"), sep);
for (auto& token : tok2) {
cout << token << " ";
}
cout << endl;
tokenizer tok3(string("hello, world, !!"), sep);
for (auto& token : tok3) {
cout << token << " ";
}
cout << endl;
return 0;
}
该代码产生如下结果:
hello world
hello
hello world !!
显然,第二行是错误的。我期待的是hello world
。有什么问题吗?
标记器不会创建您作为第一个参数传递给其构造函数的字符串的副本,也不会在构造时计算所有标记,然后缓存它们。令牌提取是按需以惰性方式执行的。
然而,为了使这成为可能,只要提取令牌,执行令牌提取的对象必须保持存活。
在这里,当tok2
的初始化结束时,要从中提取令牌的对象将超出作用域(同样适用于tok3
)。这意味着当标记器对象尝试对该字符串使用迭代器时,您将得到未定义的行为。
注意,tok3
完全是偶然地给您期望的输出。期望的输出确实是具有未定义行为的程序的可能输出之一。
相关文章:
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 分配给gslice_array会导致运行时错误
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- 将 cctype 函数分配给 std::function,gcc 编译错误
- SymSpellPlusPlus 中的分词
- 使用 C++ 的字符串到分词符
- Qt等效于提升分词器表达式/构造
- 使用 BOOST 分词器显示分隔符,并且不对引号中的字符串进行分词
- 使用 ICU 进行分词
- C++数学分词器/解析器错误
- list.h list_del() 给出内核分页错误
- 访问增强分词器的元素
- 提升分词器以将带引号的字符串视为一个标记
- 当我的分词器识别出令牌时,如何执行其他操作
- 分词器 - 预期聚合对象使用"{...}"进行初始化
- C++ 分词器变量中的错误'std::stringstream mystream'具有初始值设定项但类型不完整
- 错误的分词
- 分词错误-比较不同的单词在c++输入中出现的次数
- OpenCV 3.0分词故障(视觉词袋)