Ошибка выполнения в программе с использованием string :: insert (итератор it, char c) - PullRequest
0 голосов
/ 01 апреля 2020

Вот фрагмент кода 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;
}

Здесь я использую итераторы и после вставки . перед персонажем. Я увеличиваю итератор, потому что метод вставки устанавливает итератор в положение, в которое вставляется новый символ.

Но что-то странное происходит, я получаю ошибку во время выполнения для некоторых входных данных:

Например :

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      

Я не могу понять, почему это происходит, пожалуйста, помогите мне в этом.

Примечание: я знаю, что есть другие способы решения этой проблемы, но мне интересно знать, что здесь происходит.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

метод вставки устанавливает итератор в положение, в которое вставляется новый символ.

Нет, нет, он возвращает итератор для вставленного символа персонаж. Попробуйте это

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

или проще

it = s.insert(it, '.') + 1;
0 голосов
/ 01 апреля 2020

Итератор it становится недействительным после вставки, поэтому вам нужно настроить его следующим образом:

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

Вот пример в реальном времени .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...