Я получаю эту странную ошибку при тестировании моего кода

#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(); .