gpt4 book ai didi

c++ - 错误的分词

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:02 25 4
gpt4 key购买 nike

我有这个代码:

#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。问题是什么?

最佳答案

标记器不会创建您作为第一个参数传递给其构造函数的字符串的拷贝,也不会在构造时计算所有标记然后缓存它们。 token 提取是按需以惰性方式执行的。

但是,为了使之成为可能,在提取 token 时执行 token 提取的对象必须保持事件状态。

这里,当tok2的初始化终止时,要从中提取 token 的对象超出范围(同样适用于tok3)。这意味着当分词器对象尝试在该字符串中使用迭代器时,您将得到未定义的行为

请注意,tok3 纯属偶然地为您提供了预期的输出。预期输出确实是具有未定义行为的程序的可能输出之一。

关于c++ - 错误的分词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17011820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com