2016-11-23 8 views
-1

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

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; 
+3

Определения «Это не работает». В дополнение к этому, вы пытались использовать отладчик? –

+1

Наверное, потому что не происходит инкремента idx, поэтому вы получите бесконечный цикл, в котором вы задаете символ «i» в «. I have» на верхнем. Возможно, вы захотите использовать idx = fulltext.find (".", Idx + 1) – Nonanon

+1

Кроме того, некоторые другие проблемы в вашем коде: 1) ваше предложение 'if' не требуется, поскольку такое же условие проверяется в' while ', и если вы находитесь в цикле, это уже« истина ». 2) Если 'idx' представляет действительный индекс в вашей строке, он не означает, что автоматически означает, что' idx + 2' будет представлять собой действительный индекс. –

ответ

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 работ по iterator с вы могли бы просто использовать 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); }); 

Live Example