字符串反转后字符串比较函数的困难

Difficulties with a string comparision function after a string reversal

本文关键字:字符串 函数 比较      更新时间:2023-10-16

下面是一个回文函数和一个实现反向操作的辅助函数。出于某种原因,即使类型看起来是相同的,if-comparison语句的计算结果也永远不会为true。变量s和comp似乎都是字符串,我甚至尝试对这两个变量调用stoi()将它们转换为int,但comp由于某种原因引发了一个错误:

在引发"std::invalid_argument"的实例后调用terminatewhat():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;
}

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;
}

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)
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);
}