#c #string #algorithm #substr #function-definition
#c #строка #алгоритм #substr #определение функции
Вопрос:
Я выполнял практическое задание на codewars.com и я закончил свой код и протестировал его. Это сработало, и поэтому я попытался передать его, но затем я получил 2 случая, когда мой код не работает. Я хотел исправить свои ошибки, но я не понимаю, что означает ошибка / неудачная попытка.
Вот изображение ошибки:
Вот сообщение об ошибке:
Sample_Test_Cases
Caught std::exception, what(): basic_string::substr: __pos (which is 18446744073709551615) > this->size() (which is 3)
Random_Test_Cases
Caught std::exception, what(): basic_string::substr: __pos (which is 18446744073709551614) > this->size() (which is 8)
И вот мой код, если с ним что-то не так: D
bool solution(std::string const amp;str, std::string const amp;ending) {
long long end = ending.size(), size = str.size();
long long dif = size - end;
string endi = str.substr(dif, end);
if(endi != ending) {
return false;
}
else {
return true;
}
}
А также здесь задача, которую я должен был выполнить:
Завершите решение так, чтобы оно возвращало true, если первый переданный аргумент (строка) заканчивается 2-м аргументом (также строкой).
Пожалуйста, помогите мне разобраться, в чем проблема, спасибо!
Комментарии:
1. Что, если
ending
больше, чемstr
?2. К вашему сведению — вам не нужно создавать другую строку, просто чтобы посмотреть
str
, заканчивается лиending
она.
Ответ №1:
В общем случае размер строки str
может быть меньше размера строки ending
.
Таким образом, значение переменной dif
может быть отрицательным
long long dif = size - end;
Используется при вызове функции-члена substr
string endi = str.substr(dif, end);
он преобразуется с использованием обычных арифметических преобразований в большое целое значение без знака из-за того, что первый параметр функции имеет тип std::string::size_type
, который является целочисленным типом без знака.
Функция может быть записана следующим образом, как показано в демонстрационной программе ниже.
#include <iostream>
#include <iomanip>
#include <string>
#include <iterator>
#include <algorithm>
bool solution( const std::string amp;str, const std::string amp;ending )
{
return !( str.size() < ending.size() ) amp;amp;
std::equal( std::rbegin( ending ), std::rend( ending ), std::rbegin( str ) );
}
int main()
{
std::string s( "Hello World!" );
std::cout << std::boolalpha << solution( s, "World!" ) << 'n';
std::cout << std::boolalpha << solution( s, "World" ) << 'n';
return 0;
}
Вывод программы
true
false
Ответ №2:
Я думаю, вам нужно переключиться end = ending.size()
, и size = str.size();
.