首页 > 解决方案 > 使用 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      

我无法理解为什么会这样,请帮助我。

注意:我知道还有其他方法可以解决这个问题,但我很想知道这里发生了什么。

标签: c++stringiterator

解决方案


insert 方法将迭代器设置为插入新字符的位置。

不,它没有,它返回一个迭代器到插入的字符。尝试这个

it = s.insert(it, '.');
it++;

或更简单

it = s.insert(it, '.') + 1;

推荐阅读