Błąd krytyczny string

0

Witam,
Dostałem do ręki zadanie, które wymaga dobrego zaznajomienia ze stringami, których jak dotąd nie miałem okazji szlifować. Postanowiłem się jednak podjąć, bo prędzej czy później taka umiejętność na pewno zaplusuje :D Zadanie pochodzi z Polskiego SPOJ'a (zadanie "Flamaster")i polega na zamienieniu ciągu znaków i inputu, w ten sposób że w outpucie znaki które powtarzają się koło siebie zamieniane są na jeden znak plus ich wielokrotność (np. AAAABBBBAAABBBAAB = A4B4A3B3AAB). Popełniłem już jeden kod, ale przez dobre 2 godziny zmagałem się z ukochanym "Nieobsługiwanym wyjątkiem". Wrzucam kod i screenshota błędu. Jeżeli jakaś mądra głowa podejmie się próby doedukowania mnie w tym temacie będę mega wdzięczny.obraz_2022-03-28_141937.png

#include <iostream>
#include <string>
using namespace std;
string napis;
int ile;

int main()
{
	cin >> ile;
	for (int i = 1; i <= ile; i++)
	{
		cin >> napis;
		int dl = napis.length();
		int j = 1;
		int a = 1;
		while (dl--)
		{

			if (napis[dl-2]) // tutaj mi wywala blad (jpg w zalaczniku)
			{
				if (napis[dl - 2] == napis[dl-1])
				{
					a++;
				}
			}
			else if ((napis[dl-2] != napis[dl-1] && a>2)||(!napis[dl-2])&&(a>2))
			{
				string nowy = napis;

				nowy[dl ] = a;
					nowy.erase(dl+1, dl+a-3);
					napis = nowy;
					a = 1;
					dl = napis.length();
				
				/*
				else if (a < 100)
				{
					nowy[i + 1] = a/10;
					nowy[i + 2] = a % 10;
					nowy.erase(j + 3, dl - j + 3);
					string recha = napis.substr(j + a, dl);
					nowy.insert(j + 3, recha);
					napis = nowy;
					a = 1;
				}
				else
				{
					nowy[i + 1] = a / 100;
					nowy[i + 2] = (a%100) / 10;
					nowy[i + 3] = ((a % 100) % 10);
					nowy.erase(j + 4, dl - j + 4);
					string recha = napis.substr(j + a, dl);
					nowy.insert(j + 4, recha);
					napis = nowy;
					a = 1;
				}
				*/
			}
		}
		cout << napis << "\n";
	}

}

2

Umiesz korzystać z debuggera? jak nie to się naucz jak najszybciej.
Częstość używania debugera jest (powinna być) odwrotnie proporcjonalna do umiejętności.
Zdebuguj i wprowadź dane:

1
A
2

napis[dl-2]

A co jak dl wynosi 0 albo 1?

0

to wtedy pierwszy if (właśnie ten przy którym jest błąd) powinien sprawdzić czy istnieje taka dana i się nie wykonać jeśli odda fałsz

To zupełnie nie tak działa… „Taka dana” istnieje prawie zawsze — to będzie wartość o dwa bajty przed początkiem Twojego stringa. Tyle że to nie jest element tego stringa, więc całość wybucha.

1 użytkowników online, w tym zalogowanych: 0, gości: 1