下面是一个回文函数和一个实现反向操作的辅助函数。出于某种原因,即使类型看起来相同,if comparision语句也永远不会计算为true。变量s和comp似乎都是字符串,我甚至尝试在两者上调用stoi()将它们变成int但是由于某种原因comp会抛出错误:
在抛出' std :: invalid_argument'的实例后终止调用 what():stoi 中止(核心倾销)
我不确定问题是什么。
bool palindrome (int n)
{
string s = to_string(n);
cout << s << endl;
string comp = rev(s);
cout << comp << endl;
if (s == comp)
{
cout << s << " " << comp << endl;
return 1;
}
return 0;
}
string rev (string &s)
{
string return_string("");
for (string::iterator it = s.end(); it != (s.begin() - 1); it--)
{
return_string += *it;
}
return return_string;
}
答案 0 :(得分:3)
您的rev
函数有两个错误。首先,它计算(s.begin() - 1)
。其次,在第一次迭代时,它解引用s.end()
。两者都是未定义的行为。
使用反向迭代器的问题会更少:
string rev( const string& s )
{
string return_string;
for ( auto it = s.rbegin(); it != s.rend(); ++it )
{
return_string += *it;
}
return return_string;
}
答案 1 :(得分:2)
for (string::iterator it = s.end(); it != (s.begin() - 1); it--)
肯定是错的。在第一次迭代中,您将取消引用s.end()
,然后取消s.begin()
之前的引用。这是未定义的行为(即使是s.begin() - 1
)。
使用反向迭代器:
for(auto it = s.rbegin(); it != s.rend(); ++it)
答案 2 :(得分:0)
for (string::iterator it = s.end(); it != (s.begin() - 1); it--)
{
return_string += *it;
}
end()指向容器末尾之外的一个,因此当您取消引用它时,您将访问您不拥有的内存。 此外,尝试通过在容器启动之前将begin()递减到一个地址来访问您不拥有的更多内存。
尝试使用反向迭代器,反向结束和反向开始,如下所示:
string rev(const string &s)
{
string return_string("");
for (string::const_reverse_iterator rit = s.rbegin(); rit != s.rend(); ++rit)
{
return_string += *rit;
}
return (return_string);
}