Задача вычисления количества предложений. Созданы несколько условий, текст заносится в вектор из файла. Предполагаю, что ошибка в том, что, к примеру, на последней итерации при проверке вектора с индексом [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");
}
Во-первых, совершенно не нужный перевод 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");
Я, правда, не проверял, но, вроде, должно работать ;) Без точного ТЗ, как Вам уже написали, задачу не решить. Например:
Кто это сделал? Я. Я это сделал!
Кто это сделал? Я. Я. Иванов это сделал. (Яков Яковлевич Иванов)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Делаю обертку вокруг winapi окна, нужно затащить wndproc в класс а он статическийВобщем WindowProc не работает почемуто
Нужно подключить любую СУБД к проекту Netbeans (C++, MinGW)Провёл день в попытках подключить MySQL, так и не найдя нигде инструкции или документации
Почему у функции scanf_s в Visual Studio 2013 при использовании "%s" прекращается работа в языке Си