Wykroczenie poza zakres.

2015-09-28 16:13
0

Witam.
jestem totalnym laikiem w C++, zacząłem rozwiązywać zadania znalezione w internecie aby trochę nawyknąć do CPP. Znalazlem zadanie którego wymaganiem jest napisanie programu mającego zastępować powtarzające się znaki tekstu cyframi (np AAAAABBBCC -> A5B3CC). Wykonałem to jednym sposobem, i teraz chciałem to ugryźć troche inaczej, i natrafiłem naproblem. Z tego co widzę w linijce 36 przy pętli do/while występuje wykroczenie poza zakres. Jednak nie wiem dlaczego tak się dzieje. Zauważyłem że zawsze przy ostatnim znaku stringa jest wykraczanie poza zakres(np przy aaaaa lub nawet aa nie zlicza ostatniego znaku). Proszę o pomoc.

#include <iostream>
#include <string>

using namespace std;

int main()

{
    int ileStringow;

    cin >> ileStringow;
    string* stringi = new string[ileStringow];

    for (int i = 0; i<ileStringow; i++)
    {
        string temp;
        cin >> temp;

        int iterat = 0;
        for (unsigned int j = 0; j<temp.length(); j++)
        {
            int k = j;
            if (iterat == 0)
            {
                stringi[i] += temp.at(iterat);
                iterat++;
            }
            else if (temp.at(j) == stringi[i].at(iterat - 1))
            {
                int tryCount = 1;
                do
                {
                    tryCount++;
                    j++;
                } while (temp.at(j) == stringi[i].at(iterat - 1)&&j<temp.length());
                if (tryCount == 2)
                {
                    stringi[i] += temp.at(k);
                    iterat++;
                }
                else
                {
                    string tempo = to_string(tryCount);
                    stringi[i] += tempo;
                    iterat += tempo.length();
                }
            }
            else
            {
                stringi[i] += temp.at(j);
            }
        }
    }
    for (int i = 0; i<ileStringow; i++)
    {
        cout << stringi[i] << endl;
    }
}
która linia to 36? - twonek 2015-09-28 16:17
@twonek: @Adam Boduch - feature request :-) - Azarien 2015-09-28 21:12
Kiedys bylo :) Ale niestety na niektorych przegladarkach przy kopiowaniu kodu kopiowaly sie tez te numery linii ;) - Adam Boduch 2015-09-28 21:15

Pozostało 580 znaków

2015-09-28 16:48
2
while (temp.at(j) == stringi[i].at(iterat - 1)&&j<temp.length());

Zły warunek, sprawdzenie indeksu powinno być na początku.
Nie mówiąc rzecz jasna, że cały ten kod najlepiej wyrzuć do kosza i napisz tak, aby Twoja mama/dziewczyna/ktokolwiek inny mógł zrozumieć, co się tam dzieje.


Pozostało 580 znaków

2015-09-28 19:46
#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Podaj Ilosc \"Stringow\" do wyswietlenia" << endl;
    int iloscStr;
    cin>>iloscStr;

    string* str = new string[iloscStr];

    for (int i = 0; i < iloscStr; i++)
    {
        string temp;
        int iter = 0;
        cout << "Podaj \"Stringa\" do przetworzenia" << endl;
        cin >> temp;
        if (temp.length() != 0)str[i] += temp.at(0);
        for (int j = 1; j < temp.length(); j++)
        {
            if (temp.at(j) != str[i].at(iter))
            {
                str[i] += temp.at(j);
                iter++;
            }
            else
            {
                int strCount = 0;
                while (j < temp.length() && temp.at(j) == str[i].at(iter))
                {
                    strCount++;
                    j++;
                }
                j--;
                if (strCount == 1)
                {
                    str[i] += temp.at(j);
                    iter++;
                }
                else
                {
                    string intStr = to_string(strCount+1);
                    str[i] += intStr;
                    iter += intStr.length();
                }

            }
        }
    }
    for (int i = 0; i < iloscStr; i++)
    {
        cout << str[i] << endl;
    }
    getchar();
    getchar();
    return 0;
}

Ok teraz działa przepisałem cały kod i juz wiem co bylo zle.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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