[C++] String subscript out of range


(Kalin 93) #1

Dostaje komunikat jak w temacie, w moim rozumieniu jest to przekroczenie zakresu zaadresowanej pamięci.

#include 

#include 

#include 


using namespace std;


const char cTablica [] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','0','+','/'};


string Kodowanie (string sZrodlo )

{

	string sZakodowany;

	unsigned int nDlugosc = 0;

	while (sZrodlo [nDlugosc]) nDlugosc++;

	sZakodowany.resize ((nDlugosc/3+1)*4);

	unsigned int nPozycjaZakodowany = 0;

	for (unsigned int i = 0; i < nDlugosc/3; i++)

			{

				cout << "---" << nPozycjaZakodowany << "---";

				sZakodowany [nPozycjaZakodowany] = cTablica[sZrodlo[nPozycjaZakodowany] >> 2];

				sZakodowany [nPozycjaZakodowany+1] = cTablica [((sZrodlo [nPozycjaZakodowany]&3) << 4) | ((sZrodlo [nPozycjaZakodowany+1]&240) >> 4)];

				sZakodowany [nPozycjaZakodowany+2] = cTablica [((sZrodlo [nPozycjaZakodowany+1]&15) << 2) | ((sZrodlo [nPozycjaZakodowany+2]&192) >> 6) ];

				sZakodowany [nPozycjaZakodowany+3] = cTablica [sZrodlo [nPozycjaZakodowany+2] & 63];

				nPozycjaZakodowany += 4;		

			}	

	switch (nDlugosc%3)

	{

	case 2 :

		{

			sZakodowany [nPozycjaZakodowany] = cTablica[sZrodlo[nPozycjaZakodowany] >> 2];

			sZakodowany [nPozycjaZakodowany+1] = cTablica [((sZrodlo [nPozycjaZakodowany]&3) << 4) | ((sZrodlo [nPozycjaZakodowany+1]&240) >> 4)];

			sZakodowany [nPozycjaZakodowany+2] = cTablica [((sZrodlo [nPozycjaZakodowany+1]&15) << 2) | ((sZrodlo [nPozycjaZakodowany+2]&192) >> 6) ];

			sZakodowany [nPozycjaZakodowany+3] = '=';

		}

	case 1 :

		{

			sZakodowany [nPozycjaZakodowany] = cTablica[sZrodlo[nPozycjaZakodowany] >> 2];

			sZakodowany [nPozycjaZakodowany+1] = cTablica [((sZrodlo [nPozycjaZakodowany]&3) << 4) | ((sZrodlo [nPozycjaZakodowany+1]&240) >> 4)];

			sZakodowany [nPozycjaZakodowany+2] = '=';

			sZakodowany [nPozycjaZakodowany+3] = '=';

		}

	}

	return sZakodowany;

}


int main ()

{

	string sTest ("dupd");

	cout << Kodowanie (sTest);

	_getch ();

}

Błąd powoduje część kodu w switchu (nDlugosc%3).

Z góry dzięki za pomysły :wink:


(Marcin Obala) #2

W czym kompilujesz? Ja mam niestety zainstalowany tylko wxDevCpp i nie mogę sprawdzić w VS. W Devie jest wszystko ok.


(Fiołek) #3

Po użyciu debuggera(ty też powinieneś to zrobić!) doszedłbyś do wniosku, że winna jest linia 37. sZrodlo ma długość 4(0..3) a przy drugim "użyciu"(w tej linii) nPozycjaZakodowany ma wartość 4. Już wiesz dlaczego? :wink:


(Kalin 93) #4

Tak. Już wiem :wink:

Dodałem drugi licznik do przesuwania się po "źródle" i wszystko jest w porządku :wink: