Код проблемы палиндрома, я получаю завершение, вызываемое после выброса экземпляра 'std :: out_of_range' в ошибке c ++ - PullRequest
0 голосов
/ 06 августа 2020
#include <iostream>
#include <string>
using namespace std;

int palindromeMethod(string str)
{
    int max_val=str.size();
    bool result;
    for(int i=0;i<max_val;i++)
    {
        
        if(str.at(i)==str.at(max_val))
        {   if(i==max_val)
            {
                result=true;
            }
            max_val=max_val-1;
            
        }
        else
        {
            result=false;
        }
    }
    
    return result;
}

int main() {

string word="ROTOR";
bool result;
result=palindromeMethod(word);

if(result==true)
{
    cout << "Given String is palindrome";
}
else
{
    cout << "Given String is NOT palindrome";
}
}

Этот код я пытаюсь запустить, но получаю сообщение об ошибке, как показано ниже

terminate вызывается после создания экземпляра 'std :: out_of_range' what (): basic_string :: at: __n ( что равно 5)> = this-> size () (что равно 5) Команда завершается сигналом 6

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Две ошибки в вашем коде

int max_val=str.size();
bool result;
for(int i=0;i<max_val;i++)
{        
    if(str.at(i)==str.at(max_val))  //<-- exception here because index must be less than size() (starting from 0)

Вы можете исправить их, изменив:

int max_val=str.size() - 1;  // instead of str.size()

и индекс l oop также должен быть <=:

for(int i=0;i <= max_val;i++) // instead of i < max_val
0 голосов
/ 06 августа 2020

В вашем коде есть несколько ошибок. Тот, с которым вы столкнулись сейчас, это:

int max_val = str.size();
...
str.at(max_val)

Здесь вы индексируете один за концом вашей строки.

Следующее - ваше условие l oop конфликтует с одним из inner if s:

for (int i = 0;i < max_val;i++)
...
    if (i == max_val)

l oop останавливается, когда i становится равным max_val, поэтому if никогда не будет истинным. @artm предоставляет возможное решение для обоих из них в своем ответе.

Последняя ошибка, которую я заметил в вашей программе, заключается в том, что вы продолжаете l oop через строку даже после обнаружения несоответствующего пара символов. Это означает, что, хотя ваша программа работает с исправлениями @artm, она также сообщает "MOTOR" как палиндром. Вы можете исправить это, вернув false, как только обнаружите несоответствующую пару - или, если вы настаиваете на цикле по всей строке, затем инициализируйте bool result = true и измените свой l oop на что-то вроде:

    for (int i = 0;i <= max_val;i++)
    {
        result = result && (str.at(i) == str.at(max_val));
        max_val = max_val - 1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...