#include <locale>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;
// Используемые синонимы для типов данных.
typedef vector<wstring> word_vector;
typedef wstring::const_iterator citer;
// Функция сравнения как и у Вас для букв и цифр.
int (*cmp_func)(wint_t) = iswalnum;
// Гласные буквы. Можете добавить сюда для других языков.
const wstring VOWELS = L"aeiouy";
// Разбивает строку на слова используя нашу функцию сравнения
word_vector parse_str(const wstring& str)
{
word_vector result;
// Начало слова
citer begin = find_if(str.begin(), str.end(), pointer_to_unary_function<wint_t, int>(cmp_func)), end;
while (begin != str.end())
{
// Конец слова
end = find_if(begin, str.end(), not1(pointer_to_unary_function<wint_t, int>(cmp_func)));
// Cохраняем слово
result.push_back(wstring(begin, end));
// Ищем дальше
begin = find_if(end, str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
}
return result;
}
// Разбивает строку на слова начинающиеся с гласных
word_vector parse_str_vowels(const wstring& str)
{
word_vector result;
citer begin = str.begin(), end;
begin = find_if(str.begin(), str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
while (begin != str.end())
{
end = find_if(begin, str.end(), not1(pointer_to_unary_function<wint_t, int>(cmp_func)));
// Слово
wstring word(begin, end);
// Проверяем начинается ли с гласной
if (VOWELS.find(towlower(word[0])) != wstring::npos)
{
// Если да то сохраняем
result.push_back(word);
}
begin = find_if(end, str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
}
return result;
}
int main()
{
locale::global(locale(""));
// Вводим строку
wcout << L"Введите строку:" << endl;
wstring str;
getline(wcin, str);
// 1й вариант
wcout << L"Вариант 1:" << endl;
word_vector words = parse_str(str);
copy(words.begin(), words.end(), ostream_iterator<wstring, wchar_t>(wcout, L"\n"));
// 2й вариант
wcout << L"Вариант 2:" << endl;
words = parse_str_vowels(str);
copy(words.begin(), words.end(), ostream_iterator<wstring, wchar_t>(wcout, L"\n"));
// 3й вариант
wcout << L"Вариант 3:" << endl;
words = parse_str_vowels(str);
if (words.size())
{
wcout << words[0] << endl;
}
else
{
wcout << L"Нет слов начинающихся с гласных" << endl;
}
return 0;
}
Введите строку:
English is a West Germanic language that developed in England and south-eastern Scotland during the Anglo-Saxon era.
Вариант 1:
English
is
a
West
Germanic
language
that
developed
in
England
and
south
eastern
Scotland
during
the
Anglo
Saxon
era
Вариант 2:
English
is
a
in
England
and
eastern
Anglo
era
Вариант 3:
English
#include <locale>
#include <iostream>
#include <cstring>
using namespace std;
// Размер буфера
const size_t MAX_LEN = 255;
// Гласные буквы. Можете добавить сюда для других языков.
const wchar_t* VOWELS = L"aeiouy";
// Выводит слова
void parse_str(const wchar_t* const str)
{
// Начало строки
const wchar_t *begin = str;
// Ищем первую букву или цифру
while (*begin && !iswalnum(*begin))
{
++begin;
}
// Пока не конец строки
while (*begin)
{
const wchar_t* end = begin;
// Ищем первую не букву или цифру
while (*end && iswalnum(*end))
{
++end;
}
// Выводим
while (begin != end)
{
wcout << *begin++;
}
wcout << endl;
// Продолжим поиск буквы или цифры
while (*begin && !iswalnum(*begin))
{
++begin;
}
}
}
// Выводит слова начинающиеся с гласной в количестве заданном 2м параметром
void parse_str_vowels(const wchar_t* const str,size_t count)
{
const wchar_t *begin = str, *end = 0;
while (*begin && !iswalnum(*begin))
{
++begin;
}
while (*begin)
{
end = begin;
while (*end && iswalnum(*end))
{
++end;
}
// Если первая буква гласная
if (wcschr(VOWELS, towlower(*begin)))
{
while (begin != end)
{
wcout << *begin++;
}
wcout << endl;
// Уменьшим счетчик и проверим не пора ли остановиться
if(!--count)
{
return;
}
}
else
{
begin = end;
}
while (*begin && !iswalnum(*begin))
{
++begin;
}
}
}
int main()
{
locale::global(locale(""));
wchar_t str[MAX_LEN];
wcout << L"Введите строку:" << endl;
wcin.getline(str, MAX_LEN);
wcout << L"Вариант 1:" << endl;
parse_str(str);
wcout << L"Вариант 2:" << endl;
parse_str_vowels(str,-1);
wcout << L"Вариант 3:" << endl;
parse_str_vowels(str,1);
return 0;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.