Почему выдает ошибку? - C++

241
13 декабря 2017, 23:47

Вот исходный код:

#include "stdafx.h"
#include <string>
#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    std::string P, R;
    cin >> P >> R;
    vector<char> PMassive(P.begin(), P.end());
    vector<char> RMassive(R.begin(), R.end());
    int counter = 0;
    int counter2 = R.length();
metka:
    int counter3 = P.length();
    if (counter2 == 0) goto end;
    if (PMassive[counter3] == RMassive[counter2]) {
        counter2--;
        counter3--;
    }
    else if (counter2 != 0) { counter++; goto metka; }
end:
    std::cout << counter;


    Sleep(5000);
    return 0;
}

Выдает ошибку vector subscript out of range: http://snap.ashampoo.com/biLxWrF4 Проблема в (PMassive[counter3] == RMassive[counter2]). Что мне сделать, чтобы ее исправить?

Answer 1

Потому что массивы в C++ индексируются не от 1 до длины, а от 0 до (длины − 1).

А вы начинаете итерацию с индекса P.length(), который равен длине.

Answer 2

При работе с контейнером std::string P вам разрешается обращаться к элементам с индексами в диапазоне [ 0, P.length() ]. Основное содержимое строки будет располагаться по индексам от 0 до P.length() - 1, а последний элемент - с индексом P.length() - будет вести себя как нулевой терминатор, следующий сразу за основным содержимым строки.

Однако этот нулевой терминатор не считается собственной частью строки и в диапазон итераторов [ P.begin(), P.end() ) он не входит. Поэтому если вы решили скопировать содержимое строки в другой контейнер - вектор - через

vector<char> PMassive(P.begin(), P.end());

то в этом векторе P вам уже не разрешается доступаться к элементу с индексом P.length(). Такого элемента не существует. Разрешенные индексы для такого вектора лежат в диапазоне [ 0, P.length() - 1 ].

Вы же обращаетесь в этот вектор по индексу P.length(), что и приводит к ошибке.

READ ALSO
Как правильно считывать в структуру?

Как правильно считывать в структуру?

Есть текстовый файл 1txt

227
Поиск слова в файле с помощью found

Поиск слова в файле с помощью found

Пишу код чтобы он искал введеное слово в файле и возвращал значение (false или true в зависимости от наличия слова), но программа всегда возвращает...

173
C и C++. Pointer(int*) to int

C и C++. Pointer(int*) to int

Вот код в C++

248
multiple definition of помогите [дубликат]

multiple definition of помогите [дубликат]

На данный вопрос уже ответили:

245