Программа работает неверно, out_of_range - нужно разделить строку по символу на две части
Задание: Если более менее подробно, то суть задания разделить строку по заданному нами символу на две другие строки (и вернуть эти строки) и при этом сам этот символ не в одну из строк не включать, если символ в строке не встречается, то в первом результате возвращается полная строка, а вторая часть пуста. В целом, программа работает верно для случаев, например, "12 abcde 89" разделить по символу "c" или "aaa aaa" разделить по символу "a".
Проблема: Но если ввести строку "123456" и символ "b", то вместо первого результата равного 123456 и второго результата, который должен вернуться пустым, происходит ошибка std:out_of_range, и я не могу понять почему, просто без понятия, что в этот момент идет неверно т.к на мой взгляд, всё должно быть учтено, и pos не должно становится больше длины строки.
#include <iostream>
#include <string>
void spalte_ab_erstem(char zeichen, std::string eingabe, std::string &erster_teil,std::string &zweiter_teil)
{
using namespace std;
int pos = 0;
for (pos; eingabe.at(pos) != zeichen and pos < eingabe.length(); pos++)
{
cout << pos;
erster_teil += eingabe.at(pos);
}
pos = pos + 1;
if (pos < eingabe.length() - 1)
{
for (pos ; pos < eingabe.length(); pos++)
{
zweiter_teil += eingabe.at(pos);
}
}//*/
}
int main()
{
using namespace std;
cout << "Пожалуйста, введите однострочную строку: ";
string zeichenkette;
getline(cin,zeichenkette);
cout << "Пожалуйста, введите знак: ";
char zeichen;
cin >> zeichen;
string leer1 = "", leer2 = "";
spalte_ab_erstem(zeichen, zeichenkette, leer1, leer2);
cout << "Der erste Teil der Zeichenkette lautet: " << leer1 << endl;
cout << "Der zweite Teil der Zeichenkette lautet: " << leer2 << endl;
system("PAUSE");
}
Ответы (1 шт):
замените
for (pos; eingabe.at(pos) != zeichen and pos < eingabe.length(); pos++)
на
for (pos; pos < eingabe.length() and eingabe.at(pos) != zeichen; pos++)
как я понимаю происходит следующая вещь
если разделителя нет, то вся строка проходится до конца и переходит к pos = eingabe.length()
дальше идет условие eingabe.at(pos) != zeichen, но pos уже вне строки, поэтому вываливается ошибка
в условии проверка идет до первого невыполнения условия, поэтому лучше сначала проверять на не выход за строку и лишь потом проверять символ в строке на соответствие разделителю
тогда если позиция в строке уже вне строки на первой же проверке проверка прекратится и не будет выполняться вторая, которая и валится