Программа работает неверно, 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 шт):

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

замените

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 уже вне строки, поэтому вываливается ошибка

в условии проверка идет до первого невыполнения условия, поэтому лучше сначала проверять на не выход за строку и лишь потом проверять символ в строке на соответствие разделителю

тогда если позиция в строке уже вне строки на первой же проверке проверка прекратится и не будет выполняться вторая, которая и валится

→ Ссылка