c++ - 使用 string::insert(iterator it, char c) 的程序中的运行时错误
问题描述
这是一个 C++ 片段,它.
在字符串中的每个字符之前插入一个点。
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
for (auto it = s.begin(); it != s.end(); it++)
{
s.insert(it, '.');
it++;
}
cout << s;
}
在这里,我使用迭代器并在插入.
字符之前。我正在递增迭代器,因为 insert 方法将迭代器设置为插入新字符的位置。
但是发生了一些奇怪的事情,我收到一些输入的运行时错误:
例如:
Input: abcde
Output: .a.b.c.d.e
Input: abcdef
Output: .a.b.c.d.e.f
Input: abcdefg
Output: .a.b.c.d.e.f.g
Input: abcdefgh
Output: Getting runtime error
~~Dr.M~~ Error #1: UNADDRESSABLE ACCESS beyond heap bounds: reading 0x10fb4fa7-0x10fb4fa8 1 byte(s)
~~Dr.M~~ # 0 replace_memmove [d:\drmemory_package\drmemory\replace.c:802]
~~Dr.M~~ # 1 std::char_traits<>::move [C:/Programs/mingw-w64-7/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/bits/char_traits.h:342]
~~Dr.M~~ # 2 std::__cxx11::basic_string<>::_S_move [C:/Programs/mingw-w64-7/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/bits/basic_string.h:349]
~~Dr.M~~ # 3 std::__cxx11::basic_string<>::_M_replace_aux [C:/Programs/mingw-w64-7/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/bits/basic_string.tcc:407]
~~Dr.M~~ # 4 std::__cxx11::basic_string<>::insert
我无法理解为什么会这样,请帮助我。
注意:我知道还有其他方法可以解决这个问题,但我很想知道这里发生了什么。
解决方案
insert 方法将迭代器设置为插入新字符的位置。
不,它没有,它返回一个迭代器到插入的字符。尝试这个
it = s.insert(it, '.');
it++;
或更简单
it = s.insert(it, '.') + 1;
推荐阅读
- android - 如何在 ViewHolder Android Studio 中设置可绘制背景?
- c# - 检查是随机创建的添加的答案在 C# 中是否正确
- firebase - 同时使用实时数据库和 Firestore
- bash - 如何制作循环将 groff 文档编译到特定文件夹中
- c - 如何将 typedef 变量用作函数的参数
- python - 在 Python 中直接从 Web 读取 txt 文件
- apache-spark - Spark SQL 中 Encoders.kryo[T] 和 Encoders.product[T] 的区别
- python - 带有 cURL 错误 404 的 Python 3 许可证检查器
- angular - 为什么我在尝试调用 Firebase Cloud Function API 时会收到此 CORS 错误,但如果我处于调试模式,它似乎可以工作?
- javascript - 函数未在 HTMLButtonElement.onclick 中定义