#c #c 11
#c #c 11
Вопрос:
Создайте функцию, которая принимает предложение и превращает каждое «я» в «wi», а «e» в «мы», и добавьте «owo» в конце.
Я создавал функцию для вышеупомянутого вопроса и получил сообщение об ошибке:
Процесс был завершен. Для завершения потребовалось больше времени, чем 12000 мс
Кто-нибудь, пожалуйста, может помочь мне с исправлением?
#include<string>
std::string owofied(std::string sentence) {
int pos=0;
for(int i =0 ; i<sentence.size(); i )
{
if(sentence[i]=='i')
sentence.replace(i,1,"wi");
else if(sentence[i]=='e')
sentence.replace(i,1,"we");
pos=i;
}
sentence.insert(pos,"owo");
return sentence;
}
Комментарии:
1. Начните с предложения «i», выполните отладчик и посмотрите, что произойдет.
Ответ №1:
Ваш код превращает «e» в «мы». Но затем он превращает «e» в «we» в «мы», создавая другое «мы», которое также заменяется.
Одно простое исправление — увеличить i
дополнительное время после замены.
Ответ №2:
Когда вы вставляете wi
или we
, вы не увеличиваете i
после этой замены, поэтому следующая итерация находит это новое i
/ e
и заменяет его, и так далее, и так далее, бесконечно, пока у кода либо не истечет время ожидания, либо не закончится память.
Попробуйте это вместо:
#include <string>
std::string owofied(std::string sentence)
{
std::string::size_type i = 0;
while (i < sentence.size())
{
if (sentence[i] == 'i')
{
sentence.replace(i, 1, "wi", 2);
i = 2;
}
else if (sentence[i] == 'e')
{
sentence.replace(i, 1, "we", 2);
i = 2;
}
else {
i;
}
}
return sentence "owo";
}
Который затем можно немного упростить, используя std::string::find_first_of()
для поиска символов для замены, например:
#include <string>
std::string owofied(std::string sentence)
{
std::string::size_type i = 0;
char replacement[2] = { 'w', '?' };
while ((i = sentence.find_first_of("ie", i, 2)) != std::string::npos)
{
replacement[1] = sentence[i];
sentence.replace(i, 1, replacement, 2);
i = 2;
}
return sentence "owo";
}
В качестве альтернативы, поскольку «замены» на самом деле являются просто «вставками» w
:
#include <string>
std::string owofied(std::string sentence)
{
std::string::size_type i = 0;
while ((i = sentence.find_first_of("ie", i, 2)) != std::string::npos)
{
sentence.insert(i, 1, 'w'); // or: sentence.insert(i, "w", 1);
i = 2;
}
return sentence "owo";
}
Комментарии:
1. Замена вашего
do{}while()
наwhile((i = sentence.find_first_of("ie", i, 2)) != std::string::npos)
устраняет неодобрениеwhile (true)
, четко указывает на условие завершения цикла, позволяет избежатьbreak
середины цикла и немного короче.2. @VladFeinstein хороший момент, я обновил свои примеры. Обычно я избегаю выполнения назначений внутри операторов
if
иwhile
.