C ++ string _Xout_of_range («неверная позиция строки»); - PullRequest
0 голосов
/ 20 сентября 2019

Я новичок в C ++.У меня есть задание с просьбой выполнить ряд действий на основе ввода.Кажется, что код работает, но останавливается, когда размер моей строки достигает 16. Пробовал с 2 контрольными случаями.

Вводом является целое число, за которым следует новая строка, за которой следуют буквенно-цифровой + пробел + '[' или ']'или' <'пример: </p>

1
my ]]name]] is]] joha<n]<n doe]]]]]

код:

int main() {
    int TC; cin >> TC; cin.get(); //absorb newline
    while (TC--) {
        string s1;
        string::iterator itr = s1.begin(); //move using iterators
        while (1) {
            char c;
            cin.get(c);
            if (c == '[') { //move to first element
                itr = s1.begin();
            }
            else if (c == ']') { // move to last element
                itr = s1.end();
            }
            else if (c == '<') {
                if (s1.length() > 0) {
                    itr--;
                    s1.erase(itr); //erase current position
                }
            }
            else if (c == '\n') { //cout at newline char
                cout << s1 << endl;
                break;
            }
            else {  //add to string
                s1.insert(itr, c);
                itr++;
            }
            cout << s1 << ' ' << s1.size() << endl; //checking
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 20 сентября 2019

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

вам необходимо использовать итераторы, возвращаемые из этих функций-членов.

Вот демонстрационная программа.

#include <iostream>
#include <string>
#include <limits>
#include <sstream>

int main() 
{
    std::string input( "1\nmy ]]name]] is]] joha<n]<n doe]]]]]\n" );

    std::istringstream iss( input );

    size_t n;

    iss >> n;
    iss.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

    while ( n-- )
    {
        std::string s;
        char c;

        auto it = s.end();
        while ( iss.get( c ) && c != '\n' )
        {
            switch ( c )
            {
            case ']':
                it = s.end();
                break;

            case '[':
                it = s.begin();
                break;

            case '<':
                if ( it != s.begin() )
                {
                    it = s.erase( --it );
                }                   
                break;

            default:
                it = s.insert( it, c );
                ++it;
                break;
            }
        }

        std::cout << s << '\n';
    }

    return 0;
}

Его выход составляет

my name is john doe
...