Процесс был завершен. Для завершения потребовалось больше времени, чем 12000 мс

#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 .