#include <ctype.h>
int word_count(const char *str) {
int wc = 0;
int in_word = 0;
for (; *str; ++str) {
if (in_word) {
in_word = !isspace(*str);
} else {
if (!isspace(*str)) {
++wc;
in_word = 1;
}
}
}
return wc;
}
#include <iostream>
#include <string>
#include <locale>
#include <algorithm>
#include <functional>
using namespace std;
// Разделители слов. В данном случае пробел. Добавьте что считаете нужным.
const wchar_t delimiters[]=L" ";
// Подсчитывает кол. слов в строке
size_t wordsCount(const wstring& str)
{
size_t count=0;
// Индекс текущего символа
wstring::size_type cur=0;
// Ищем первый не разделитель и пока есть такие
while((cur=str.find_first_not_of(delimiters,cur))!=wstring::npos)
{
// Инкрементируем счетчик
++count;
// Ищем конец слова(разделитель)
cur=str.find_first_of(delimiters,cur);
}
return count;
}
// ---------------- Второй способ ---------------------------------------------------
// Функтор, используемый ниже, для проверки символа на предмет является ли он разделителем
class isDelimPred:public unary_function<wchar_t,bool>
{
public:
result_type operator()(argument_type ch)const
{
#pragma warning(disable:4800)
return iswspace(ch);
}
};
// Вторая функция делающая то же самое только слегка по другому
size_t wordsCount2(const wstring& str)
{
size_t count=0;
wstring::const_iterator cur=str.begin(),end=str.end();
while((cur=find_if(cur,end,not1(isDelimPred())))!=end)
{
++count;
cur=find_if(cur,end,isDelimPred());
}
return count;
}
// --------------------------------------------------------------------------------------
int main()
{
locale::global(locale("russian_russia.866"));
wcout<<L"Введите строку:"<<endl;
wstring str;
getline(wcin,str);
wcout<<L"Количество слов в строке:"<<wordsCount(str)<<endl;
system("PAUSE");
return 0;
}
Введите строку:
Сколько же здесь слов?
Количество слов в строке:4
Настоящие программисты не пишут комментарии - текст программы всё объясняет сам
int WordsCount(string str)
{
int wc = 0; //счетчик
int fSpacePrev; //признак, является ли разделителем предыдущий символ
int fSpaceCurr=1; //признак, является ли разделителем текущий символ
// вначале считаем, что начало с разделителя
for (int i=0; i<str.size(); ++i) //по всем символам строки
{
fSpacePrev = fSpaceCurr; //сохраним текущее состояние, как предыдущее
fSpaceCurr = isspace(str.c_str()[i]); //проверим текущий символ на разделитель
//1 - разделитель, 0 - нет
wc += fSpacePrev && !fSpaceCurr; //самое интересное:
// увеличиваем счетчик слов только если
// предыдущее состояние - разделитель,
// а текущее - нет, т.е. в начале слова
}
return wc;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.