简体   繁体   中英

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at: __n error

在此处输入图像描述 I am trying to take multiple test cases input of a string and then test my code for printing the longest palindrome in the provided string, my logic works perfectly well but this part of multiple test cases in the main() function is throwing the following error

terminate called after throwing an instance of 'std::out_of_range'   what():  basic_string::at: __n error

I tried to debug my program and found that when I call longestPalin() function in the main() function, it is throwing an error. Please tell me what's wrong there

#include <iostream>
#include <string>
using namespace std;
bool isPalin(string s, int k, int j)
{
    bool isPalindrome = true;
    for (int i = k; i < k + ((j - i + 1) / 2); i++)
    {
        if (s.at(i) != s.at(j - i + 1))
        {
            isPalindrome = false;
            return isPalindrome;
        }
    }
    return isPalindrome;
}
string longestPalin(string s)
{
    string str;
    int i, j;
    i = 0;
    j = s.size() - 1;
    while (i < j)
    {
        if (s.at(i) != s.at(j))
        {
            j--;
        }
        else
        {
            if (isPalin(s, i, j))
            {
                str = s.substr(i, j - i + 1);
            }
            else
            {
                i++;
                j = s.size() - 1;
            }
        }
    }
    return str;
}
int main()
{
    int T;
    string s;
    cin >> T;
    for (int i = 0; i < T; i++)
    {
        cout << "enter a string" << endl;
        cin >> s;
        cout << "string is taken" << endl;
        longestPalin(s);// this part is throwing error
    }
    return 0;
}

this line is causing error and you can see that s.at(i) is working, it means that s is accessible and it is not giving out of bound error

Your error is at the line 9 . When you are doing:

if (s.at(i) != s.at(j - i ))

then s.at(j - i + 1) is causing a std::out_of_range exception . When the starting letter of your string and the endinf letter is the same, it goes through this code and it is out of range.

For instance, if your input is as follows:

aaabba

you will have j - i + 1 will be equal to 6 at the first run of the loop (for k equals to 0 and j equals to 5 , however, you cannot have s.at(6) as your string has a size of

This will happen only if your input has the first letter similar to its last letter.

That doesn't mean that there won't be any other problem. I have seen for instance that if you correct this code to be "in-range" , you still have an infinite loop that comes after it.

To help you see the problem, either use gdb or any other debugger and go through it line by line or at least debug by printing some messages and values to allow you to track invalid values (like the following simple debug messages - which is not ideal but better than nothing imho).

I suggest you a good 20-min gdb tutorial here

bool isPalin(string s, int k, int j)
{
    bool isPalindrome = true;
    for (int i = k; i < k + ((j - i + 1) / 2); i++)
    {
        //put breakpoint here or some debug messages
        std::cout << "j = " << j << " and j - i + 1 = " << j - i + 1 << std::endl;
        std::cout << "problem is not here "<<s.at(i) << " but here " << s.at(j - i + 1) << std::endl;
        if (s.at(i) != s.at( j - i +1))
        {
            isPalindrome = false;
            return isPalindrome;
        }
    }
    return isPalindrome;
} 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM