Дан текст. Нужно поменять регистр букв после точки
Исходный текст набран с ошибками . Вывести исходный текст, заменив в нем строчные(малые) буквы, следующие за точкой и произвольным количеством пробелов на прописные(большие) буквы. В исходном тексте может быть много предложений и точек. А также вычислить количество слов «ПК». (не использовать find)
string first{"the problem wasn't Dulce or his father.to discover and define those laws is the problem of history.it's a big problem. i.i.ivanov"};
cout << first;
decltype(first.cbegin()) iter;
size_t position = 0;
auto mPos = first.size();
while (mPos<first.size())
{
iter = find(first.cbegin(), first.cend(), '.');
position = distance(first.cbegin(), iter) + 1;
transform(first.cbegin(), first.cend(), first.cbegin() + position, ::tolower(iter));
}
'
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Проще пройтись чем-то типа конечного автомата...
string s{"the problem wasn't Dulce or his father. to discover and define those laws is the problem of history.it's a big problem. i.i.ivanov"};
cout << s << endl;
for(size_t state = 0, i = 0; s[i]; ++i)
{
switch(state)
{
case 0:
if (s[i] != '.') break;
state = 1;
break;
case 1:
if (s[i] == ' ' || s[i] == '.') break;
s[i] = toupper(s[i]);
state = 0;
break;
}
}
cout << s << endl;
Если нужно менять и самый первый символ -
for(size_t state = 1, i = 0; s[i]; ++i)
Можно без switch - даже короче:
for(size_t state = 1, i = 0; s[i]; ++i)
{
if (state)
{
if (s[i] != ' ' && s[i] != '.')
{
s[i] = toupper(s[i]);
state = !state;
}
} else if (s[i] == '.') state = !state;
}
Количество слов сами допишете? :)