如何解决在抛出 'std::out_of_range' what() 实例后调用终止:basic_string::at: __n 错误
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at: __n error
我尝试调试我的程序,发现当我在 longestPalin()
函数中调用 main()
函数时,它抛出错误。
请告诉我那里有什么问题
#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;
}
这一行导致错误,您可以看到 s.at(i) 正在工作,这意味着 s 是可访问的,并且没有给出越界错误
解决方法
您的错误出现在 9
行。当你在做:
if (s.at(i) != s.at(j - i ))
然后 s.at(j - i + 1)
导致 std::out_of_range exception
。当你的字符串的起始字母和 endinf 字母相同时,它通过这段代码并且超出范围。
例如,如果您的输入如下:
aaabba
在循环的第一次运行时,您将有 j - i + 1
将等于 6
(对于 k equals to 0
和 j equals to 5
,但是,您不能有 {{1}因为您的字符串的大小为
只有当您输入的第一个字母与最后一个字母相似时才会发生这种情况。
这并不意味着不会有任何其他问题。例如,我已经看到,如果您将此代码更正为 s.at(6)
,您仍然会在它之后出现无限循环。
为了帮助您查看问题,请使用 "in-range"
或任何其他调试器并逐行检查它,或者至少通过打印一些消息和值进行调试以允许您跟踪无效值(如下面的简单调试消息 - 这并不理想,但总比没有好。恕我直言)。
我建议你一个好的 20 分钟 gdb
教程 here
gdb
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。