Простите, конечно же, Автор, но алгоритм Вашей программы делает не то, что требуется.
Лично я бы предложил не считать пробелы, поскольку таким образом не учитываются пробелы, идущие подряд, предложения, состоящие только из пробелов, предложения не содержащие пробелов.
ИМХО, простите, если не понравится, лучше считывать слово за словом, например, перегруженной в потоке операцией сдвига (то есть
cin >> ). Эта операция как раз воспринимает пробелы как разделители вводимых строк, а несколько пробелов подряд считает одним разделителем.
Полезный метод потоков ввода (а значит и cin) — peek(). Его можно вызывать всякий раз перед тем, как считать с клавиатуры очередное слово. Позволяет проверить, закончен ли ввод, определяя код следующего символа на очереди к считыванию из потока, но фактически не считывает его. Следовательно, если на очереди к считыванию символ '\n' либо EOF, значит, ввод фактически закончен, и любая попытка ввести следующее слово приведёт к ожиданию ввода с клавиатуры.
ПРИМЕРНАЯ ПРОГРАММА:
#include <iostream>
#include <string>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int count = 0;
string Line;
cout << "Введите предложение: \n";
// подготовка к вводу с клавиатуры
cin.clear();
cin.sync();
while ('\n' != cin.peek()) // цикл пока не нажата клавиша Enter
{
if (!(cin >> Line)) break; // выход, если встретился конец потока
count++; // считано ещё одно слово — увеличиваем счётчик
}
cout << "Слов в предложении - " << count;
}
Как-то у меня тупик возник...
#include iostream
#include string
#include Windows.h
#include cctype
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int count = 0;
string Line;
cout << "Введите предложение: ";
getline(cin, Line);
for (int i = 0; i < Line.size(); i++)
{
if (isspace(i))
count++;
}
cout << "Слов в предложении - " << count;
}
Писал следующее:
Мама - 0 слов
Мама мыла - 0 слов
Мама мыла раму - 5 слов.