Ошибка 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 шт):
Если у вас строка symbols пустая, то вы проверяете почему-то symbols[0]. Там и ошибка. Проверять сначала нужно, что k==0 (символов ещё нет). А лучше сразу первый символ завести без условий.
Символы нужно добавлять в строку, а не присваивать в неизвестное место
symbols[0] = text[0];. Например так, symbols += text[0];Вы своим сравнением с первым символом останавливаете весь процесс. Цикл останавливается здесь
if (text[i] == text[0]) { break; }. Уберите этот if - он останавливает цикл просмотра строки. Напишите сначала алгоритм словами: ищу записанные буквы, и если не нашёл, то добавляю.