字符串::替换在有效的迭代器上抛出 std::out_of_range
string::replace throws std::out_of_range on valid iterators
真的无法弄清楚'在抛出'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].secondt" << 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 如果真的重要的话
加速版本:1.52.0
更新:
第一:下面的等式是错误的 s[0].first - e[0].second 应该是 e[0].second - s[0].first - 我想知道为什么没有人看到这个(我也是) - 但认为这是一个错字,导致 s[0].first - tmpTemplate.begin() 无论如何都会返回负数。
tmp模板定义并初始化为
std::string tmpTemplate= getTemplate();
太好了 - 正如我所说 s[0].first - tmpTemplate.begin() 返回负数
如果 tmpTemplate 被定义并初始化为
std::string tmpTemplate(getTemplate().data(), getTemplate().length());
一切都很好。
第二:
停止提升::match_results未初始化的废话请阅读regex_search文档,它说:"如果我找不到匹配项,我返回 false"
第三:
std::string tmpTemplate= getTemplate();
和
std::string tmpTemplate(getTemplate().data(), getTemplate().length());
确实不同。
自己的选择:
它是以太内存损坏,它发生在我的代码中的其他地方,我无法使用 valgrind 检测到它,或者不是我代码一部分的错误。
tmpTemplate
、elementStartTag
和elementEndTag
的内容是什么? 如果elementEndTag
在 tmpTemplate
中的elementStartTag
之前,那么您肯定会收到out_of_range
错误。
最后,我建议只使用一个正则表达式,如下所示:
boost::regex matcher( ".*(" + elementStartTag + ")(.*)(" + elementEndTag + ").*");
然后使用boost::regex_match
而不是搜索。 这保证了订单;但是,如果序列中有多个匹配元素,则可能会导致问题。 如果这是一个问题:您应该使用:
boost::regex_search( s[1].second, tmpTemplate.end(), e, end )
作为匹配结尾的表达式。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- swig perl typemap(out) std::vector<std::string> 在 perl 中不返回所需的输出
- "friend std::ostream& operator<<(std::ostream& out, LinkedList& list)"是什么意思?
- 尝试同时写入 std:out 和文件
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- c ++如何使我.get() std::future out of a vector.
- 如何在 Linux 中将孩子的进程 std (out / err) 设置为父级
- fstream::open() Unicode 或非 ASCII 字符在 Windows 上不起作用(使用 std::ios::out)
- C++同时写入 std::out 和 std:clog
- Printing out std::map
- 将Std::vector通过ref / out从c#传递到c++
- QTextStream and std out
- 聚合'std::stringstream out'具有不完整的类型,无法定义 [C++]
- 以std:: Fstream::in | std:: Fstream::out | std:: Fstream::app