Задача Simple Pig Latin на Codewars
Помогите, пожалуйста, разобраться, что у меня в коде не так. Запускал его в CLion - всё работает, как и задумывалось. Но Codewars задание не принимает, в одном из тестов я получаю следующее сообщение:
Caught std::exception, what(): basic_string::insert: __pos (which is 18446744073709551615) > this->size() (which is 4)
Само задача состоит в том, чтобы сделать следующие манипуляции с входной строкой:
- Переместить первую букву каждого слова строки в конец этого слова.
- Добавить
"ay"в конец слова. - Знаки препинания оставить нетронутыми.
Примеры входных и выходных данных:
pig_it("Pig latin is cool"); // igPay atinlay siay oolcay
pig_it("Hello world !"); // elloHay orldway !
pig_it("This is my string"); // hisTay siay ymay tringsay
Вот, собственно, мой код:
#include <algorithm>
std::string pig_it(std::string str)
{
auto numOfSpaces = std::count(str.begin(), str.end(), ' ');
int wordStart = 0;
// возвращаем индекс пробела
int wordEnd = str.find(" ");
for (int word = 0; word <= numOfSpaces; ++word)
{
if (str[wordStart] == '!' || str[wordStart] == '?' || str[wordStart] == '.' || str[wordStart] == ',')
{
wordStart = wordStart + 2;
if ((numOfSpaces - word) == 1) { wordEnd = str.size(); }
else { wordEnd = str.find(" ", wordStart); }
continue;
}
str.insert(wordEnd, 1, str[wordStart]);
str.insert(wordEnd + 1, "ay");
str.erase(wordStart, 1);
wordStart = wordEnd + 3;
if ((numOfSpaces - word) == 1) { wordEnd = str.size(); }
else { wordEnd = str.find(" ", wordStart); }
}
return str;
}
Ответы (2 шт):
Внимательно пройдите пошагово свой код для строки из одного слова. Например, "Hello". Чтобы вам было понятнее, вставьте отладочный вывод типа
continue;
}
std::cout << "Debug: wordEnd = " << wordEnd << std::endl;
str.insert(wordEnd, 1, str[wordStart]);
str.insert(wordEnd + 1, "ay");
и посмотрите, куда вы хотите выполнять вставку...
Всем спасибо! Прошёл последний тест в задании, после строки
int wordEnd = str.find(" ");
дописал следующее:
if (wordEnd == std::string::npos)
{
if (str[0] == '!' || str[0] == '?' || str[0] == '.' || str[0] == ',')
{
return str;
}
str.append(1, str[0]);
str.append("ay");
str.erase(0, 1);
return str;
}