Не могу получить строку :: size_type + int, чтобы сделать toupper

Я хочу использовать toupper на каждой char после точки . в string,
Я попробовал этот код, но я получаю черный экран при запуске программы, если я использую + оператор.

string fulltext = "my name is John. i have a girlfriend. her name is Anna";

string::size_type idx = 0;
while ((idx = fulltext.find(".")) != string::npos)
{
if (idx != string::npos)
{

fulltext[idx + 2] = toupper(fulltext[idx + 2]);
}
}
cout << fulltext << endl;

-1

Решение

Вот и получается, что единственный стандартный определенный способ использования toupper это передать unsigned char: https://stackoverflow.com/a/37593205/2642059 Таким образом, лучший способ сделать это с лямбда в transform, например, вы могли бы использовать для своей выгоды string fulltext в целом так:

transform(cbegin(fulltext), cend(fulltext), begin(fulltext), [](const unsigned char idx){ return toupper(idx); })

Так как вы хотите начать с первого '.' а также transform работает на iterators вы могли бы просто использовать find чтобы получить iterator к '.' и использовать его в 1улица и 3й аргументы transform: auto it = find(begin(fulltext), end(fulltext), '.') Но мы можем избежать временной, если мы сделаем обратную итерацию:

transform(crbegin(fulltext), make_reverse_iterator(find(cbegin(fulltext), cend(fulltext), '.')), rbegin(fulltext), [](const unsigned char idx) { return toupper(idx); });

Живой пример

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]