Почему мой код RLE показывает std вне диапазона для c ++? - PullRequest
0 голосов
/ 01 октября 2019

Всякий раз, когда я пытаюсь запустить эту программу, она всегда показывает мне сообщение об ошибке

прекращение вызова после выброса экземпляра 'std :: out_of_range'

ЧтоЯ понял, что когда я пытаюсь принять ввод как строку, возникает эта проблема. Следовательно, мои циклы не выполняются должным образом.

Я действительно ценю, если кто-нибудь сможет объяснить мне, что не так с моим кодом!

#include <iostream>
#include <vector>
#include <stdexcept>
#include <string>
using namespace std;

int main()
{
    vector<string> compressed_run_lengths_data;
    vector<char> compressed_characters_data;
    int i;
    int count = 1;
    bool can_be_compressed = false;
    string data;

    try
    {
        cout << "Enter the data to be compressed: ";
        getline(cin, data);

        for (i = 0; i < data.size(); ++i)
        {
            if (!isalpha(data.at(i)))
            {
                throw runtime_error("error: invalid input");
            }
        }

        if (!data.empty())
        {
            i = 1;

            while (i <= data.size())
            {
                if (data.at(i - 1) == data.at(i))
                {
                    count++;

                    if (count > 1)
                    {
                        can_be_compressed = true;
                    }
                }
                else
                {
                    compressed_characters_data.push_back(data.at(i - 1));
                    compressed_run_lengths_data.push_back(to_string(count));
                    count = 1;
                }

                ++i;
            }

            if (can_be_compressed)
            {
                for (i = 0; i < compressed_run_lengths_data.size(); ++i)
                {
                   cout << compressed_run_lengths_data.at(i) << compressed_characters_data.at(i);
                }
            }
            else
            {
               data;
            }         
        }
    }
    catch (runtime_error &e)
    {
        cout << e.what();
        return 1;
    }

    return 0;
}

1 Ответ

4 голосов
/ 02 октября 2019

По запросу, уточнение моих комментариев:

while (i <= data.size())                // <- i runs up to and including data.size ()
{
    if (data.at(i - 1) == data.at(i))   // data.at (i) is out of range when i == data.size ()

Я не анализировал ваш алгоритм, но вы, вероятно, хотите:

while (i < data.size())

вместо.

...