Ошибка string subscript out of range в цикле for

У меня есть две строки: text и symbols. В строке text уже сохранён некоторый текст. Первое слово этого текста: "Classification". Вообще в тексте больше 1500 символов. Моя задача поместить в строку symbols все символы, которые встречаются в text, но в единичном экземпляре, т.е. просто набор символов. Я написал for с кучей условий для проверки. Благодаря шагу в visual studio смог обнаружить, что ошибка возникает на втором проходе цикла, т.е. когда text[1] = 'l'. Ошибку выбивает на строке symbols[j] = text[i];

int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream file4("E:\\text4.txt");
    if (!file4)
    {
        cout << "Error!" << endl;
        exit(1);
    }
    char s;
    int size = 0;
    while (!file4.eof()) //Выяснили размер текста
    {
        file4.get(s);
        size++;
    }
    file4.close();
    file4.open("E:\\text4.txt");
    int i = 1, k = 1, j, k_new;
    string text;
    string symbols;
    while (!file4.eof())
    {
        file4.get(s);
        text = text + s;
    }
    file4.close();
    symbols += text[0];
    for (i; i < size; i++) {                  // цикл для прохождения всего текста
        j = k - 1;                            // обновляем переменные, т.к. они были изменены
        k_new = k;                            // j: для проверки элементов symbols, k_new (размер symbols): для цикла ниже
            for (k_new; k_new > 0; k_new--) { // проводится цикл для всех элементов symbols
                if (text[i] != symbols[j]) {  // проверка на равенство данного символа элементу symbols
                    if (j != 0) {             // проверка для остановки цикла
                        j--;                  // уменьшаем j для проверки предыдущего элемента symbols
                    }
                    else {                    // если были проверены все эелменты symbols
                        symbols += text[i];   // добавляем символ в строку symbols
                        k++;                  // увеличиваем k (размерность symbols)
                        break;
                    }
                }
                else {                        // если найден такой же символ в symbols
                    break;
                }
            }
    }
    cout << symbols << endl;
    system("pause");
}


Ответы (1 шт):

Автор решения: AlexGlebe

Если у вас строка symbols пустая, то вы проверяете почему-то symbols[0]. Там и ошибка. Проверять сначала нужно, что k==0 (символов ещё нет). А лучше сразу первый символ завести без условий.


Символы нужно добавлять в строку, а не присваивать в неизвестное место symbols[0] = text[0];. Например так, symbols += text[0];
Вы своим сравнением с первым символом останавливаете весь процесс. Цикл останавливается здесь if (text[i] == text[0]) { break; }. Уберите этот if - он останавливает цикл просмотра строки. Напишите сначала алгоритм словами: ищу записанные буквы, и если не нашёл, то добавляю.

→ Ссылка