Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串反转后使用字符串比较函数的困难_C++_String - Fatal编程技术网

C++ 字符串反转后使用字符串比较函数的困难

C++ 字符串反转后使用字符串比较函数的困难,c++,string,C++,String,下面是一个回文函数和一个实现反向操作的助手函数。出于某种原因,即使类型看起来相同,if comparison语句的计算结果也永远不会为true。变量s和comp似乎都是字符串,我甚至尝试对这两个变量调用stoi(),将它们转换为int,但comp出于某种原因会抛出一个错误: 在抛出'std::invalid_argument'的实例后终止调用 什么 中止(堆芯转储) 我不确定是什么问题 bool palindrome (int n) { string s = to_string(n);

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

在抛出'std::invalid_argument'的实例后终止调用 什么 中止(堆芯转储)

我不确定是什么问题

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;

}
bool回文(int-n)
{
字符串s=到_字符串(n);
cout
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)
string rev( const string& s )
{
    string return_string;
    for ( auto it = s.rbegin(); it != s.rend(); ++it )
    {
        return_string += *it;
    }

    return return_string;
}

您的
rev
函数有两个错误。首先,它计算
(s.begin()-1)
。其次,在第一次迭代时,它取消引用
s.end()
。这两个都是未定义的行为

使用反向迭代器的问题会更少:

for(auto it = s.rbegin(); it != s.rend(); ++it)
string rev( const string& s )
{
    string return_string;
    for ( auto it = s.rbegin(); it != s.rend(); ++it )
    {
        return_string += *it;
    }

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

您是否在调试器中单步执行了代码?@LogicStuff:不过它工作得很好,可以将一个反向字符串复制到一个新字符串中。我建议您看看[FYI]