Vector subscript out of range в цикле for

193
29 декабря 2018, 07:40

Задача вычисления количества предложений. Созданы несколько условий, текст заносится в вектор из файла. Предполагаю, что ошибка в том, что, к примеру, на последней итерации при проверке вектора с индексом [i+1] or [i+2] будет выход за пределы размера вектора, но если закомментировать 3-е и последнее условие, ошибка не появляется, хотя предпоследнее условие включает в себя проверку [i+1] элемента. Подскажите, как решить данную проблему и правильно ли я мыслю.

    #include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
    int quant_sent = 0; //количество предложений
    ifstream read;
    read.open("Text.txt");
        vector<char> symbols; //символы из файла

        char n;
        while (read.get(n))
        {
            symbols.push_back(n);
        }
        cout << symbols.size() << endl;
        for (int i = 0; i != symbols.size(); i++) // Точно являются концом предложений
        {
            /*
            if ((int(symbols[i]) == 33) || (int(symbols[i]) == 63)  || (int(symbols[i]) == 46) && (int(symbols[i + 1]) == 46) && \
                (int(symbols[i + 2]) == 46) || (int(symbols[i] == 33) && int(symbols[i + 1] == 63)) || (int(symbols[i]) != 32) && \
                (int(symbols[i + 2] == 46)))
            {
                quant_sent++;
                cout << quant_sent << " : " << i << endl;
            }*/
            if (int(symbols[i]) == '!') { // !
                quant_sent++;
                cout << quant_sent << " : " << i+1 << endl;
            }
            else if (int(symbols[i]) == '?') {// ?
                quant_sent++;
                cout << quant_sent << " : " << i + 1 << endl;
            }
            /*else if (int(symbols[i]) == '.') {// ...
                if (int(symbols[i + 1]) == '.') {
                    if (int(symbols[i + 2]) == '.') {
                        quant_sent++;
                        cout << quant_sent << " : " << i + 1 << endl; // fix
                    }
                }
            }*/
            else if ((int(symbols[i]) == '!') && (int(symbols[i + 1]) == '?')) { // !?
                quant_sent++;
                cout << quant_sent << " : " << i + 1 << endl;
            }
            else if (((int(symbols[i]) != ' ') || (int(symbols[i]) != '.')) && (int(symbols[i + 2]) == '.') && (int(symbols[i+3]) != '.')) {
                quant_sent++;
                cout << quant_sent << " : " << i + 1 << endl;
            }
        }
        read.close();
            cout << "The number of sentences " << quant_sent;
            system("pause");

}
Answer 1

Во-первых, совершенно не нужный перевод char в int: int(symbols[i]). Во-вторых, у вас в 3 и 4 условиях выход за пределы массива. В-третьих, 3 условие должно быть первым, т. к. у Вас оно не выполнится никогда. Ну и т. д. Если Вы хотите перебирать вектор то проще сделать как-то так:

    vector<char> symbols; //символы из файла

    char n;
    while (read.get(n))
    {
        symbols.push_back(n);
    }
    cout << symbols.size() << endl;
    bool isLetter = true;
    char localBack;
    while(!symbols.empty())
    {
        localBack = symbols.back();
        if(localBack=='!' || localBack=='?' || localBack=='.')
        {
            if(isLetter)
                quant_sent++;
            isLetter = false;
        }
        else if (localBack!=' ')
            isLetter=true;
        symbols.pop_back();
    }
    read.close();
    cout << "The number of sentences " << quant_sent;
    system("pause");

Я, правда, не проверял, но, вроде, должно работать ;) Без точного ТЗ, как Вам уже написали, задачу не решить. Например:

Кто это сделал? Я. Я это сделал!

Кто это сделал? Я. Я. Иванов это сделал. (Яков Яковлевич Иванов)

READ ALSO
C++ wndproc в классе

C++ wndproc в классе

Делаю обертку вокруг winapi окна, нужно затащить wndproc в класс а он статическийВобщем WindowProc не работает почемуто

194
Netbeans (C/C++) + Базы данных. Как подключить любую СУБД?

Netbeans (C/C++) + Базы данных. Как подключить любую СУБД?

Нужно подключить любую СУБД к проекту Netbeans (C++, MinGW)Провёл день в попытках подключить MySQL, так и не найдя нигде инструкции или документации

179
Почему у функции scanf_s в Visual Studio при использовании &ldquo;%s&rdquo; прекращается работа в языке Си

Почему у функции scanf_s в Visual Studio при использовании “%s” прекращается работа в языке Си

Почему у функции scanf_s в Visual Studio 2013 при использовании "%s" прекращается работа в языке Си

197