gpt4 book ai didi

c++ - string::replace 在有效迭代器上抛出 std::out_of_range

转载 作者:行者123 更新时间:2023-11-28 06:29:06 25 4
gpt4 key购买 nike

真的想不通'在抛出'std::out_of_range'的实例后调用终止'的原因

std::cerr << std::string(s[0].first, s[0].second) << std::endl;
std::cerr << std::string(e[0].first, e[0].second) << std::endl;
std::cerr << std::string(s[0].first, e[0].second) << std::endl;

以上代码返回匹配结果的有效字符串

    boost::regex start(elementStartTag);
boost::regex end(elementEndTag);

boost::match_results<std::string::const_iterator> s, e;

if(!boost::regex_search(tmpTemplate, s, start)) {
dDebug() << "No start token: " << elementStartTag << " was found in file: " << templatePath();
std::cerr << "No start token: " << elementStartTag << " was found in file: " << templatePath() << std::endl;
return;
}

if(!boost::regex_search(tmpTemplate, e, end)) {
dDebug() << "No end token: " << elementEndTag << " was found in file: " << templatePath();
std::cerr << "No end token: " << elementEndTag << " was found in file: " << templatePath() << std::endl;
return;
}

//std::string::iterator si, ei;
// si = fromConst(tmpTemplate.begin(), s[0].second);
// ei = fromConst(tmpTemplate.begin(), e[0].first);

// std::cerr << std::string(si, ei) << "\t" << ss.str(); // return valid string

std::cerr << std::string(s[0].first, s[0].second) << std::endl;
std::cerr << std::string(e[0].first, e[0].second) << std::endl;
std::cerr << std::string(s[0].first, e[0].second) << std::endl;


std::cerr << "s[0].first - tmpTemplate.begin()\t" << s[0].first - tmpTemplate.begin() << std::endl;
std::cerr << "s[0].first - e[0].second\t" << s[0].first - e[0].second << std::endl;

//tmpTemplate.replace(fi, se, ss.str()); //also throws exeption
tmpTemplate.replace(s[0].first - tmpTemplate.begin(), s[0].first - e[0].second, "test"); // throws exeption

gcc 版本:4.7.3 如果真的重要的话

boost 版本:1.52.0

更新:

首先:下面的等式是错误的 s[0].first - e[0].second 应该是 e[0].second - s[0].first - 我想知道为什么没有人看到这个(我也是) - 但认为这是一个错字,导致 s[0].first - tmpTemplate.begin() 无论如何都会返回负数。

tmpTemplate 定义并初始化为

  std::string tmpTemplate= getTemplate();

很好 - 正如我所说的 s[0].first - tmpTemplate.begin() 返回负数

如果 tmpTemplate 被定义并初始化为

std::string tmpTemplate(getTemplate().data(), getTemplate().length());

一切都很好。

第二个:

停止 boost::match_results 未初始化的废话,请阅读 regex_search 文档,它说:“如果我找不到匹配项,我将返回 false”

第三:

std::string tmpTemplate= getTemplate();

std::string tmpTemplate(getTemplate().data(), getTemplate().length());

确实不同。

自己的结论:

这是在我的代码中其他地方发生的内存损坏,我无法使用 valgrind 检测到它,或者是不属于我的代码的错误。

最佳答案

tmpTemplateelementStartTagelementEndTag的内容是什么?如果 tmpTemplate 中的 elementEndTagelementStartTag 之前,那么您肯定会收到 out_of_range 错误。

最后,我建议只使用一个正则表达式,大致如下:

boost::regex matcher( ".*(" + elementStartTag + ")(.*)(" + elementEndTag + ").*");

然后使用 boost::regex_match 而不是搜索。这保证了顺序;但是,如果序列中有多个匹配元素,则可能会出现问题。如果这是一个问题:您应该使用:

boost::regex_search( s[1].second, tmpTemplate.end(), e, end )

作为匹配结尾的表达式。

关于c++ - string::replace 在有效迭代器上抛出 std::out_of_range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959640/

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