字符串反转后字符串比较函数的困难
Difficulties with a string comparision function after a string reversal
下面是一个回文函数和一个实现反向操作的辅助函数。出于某种原因,即使类型看起来是相同的,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);
}
相关文章:
- 字符串函数在目标C++上运行时C++返回空
- 字符串函数返回奇怪的值
- 这里的字符串函数是什么意思
- 在字符串函数中抛出'char const*'实例后调用的终止
- 为什么 stl 字符串C++函数有时出错有时会出错?
- 从C++为字符串函数设置_ENV
- 来自 2D 数组的字符串函数
- 返回最长的公共子字符串函数 c ++
- 使用getline和字符串函数C++程序中的分段错误
- 在字符串函数的指针中返回地址
- 字符串函数:strcat()
- 这个子字符串函数有什么问题
- 字符串函数不返回字符串? C++
- 使用向量和字符串函数返回字符串
- 尝试修复一个字符串函数,该函数采用字符串并通过替换一些单词来更改它
- 逐字读取字符数组,无需字符串函数
- 我从我的字符串函数返回到主函数
- 为什么我不能从字符串函数返回字符串数组?
- 如何在不使用字符串函数的情况下在char数组中找到字符串?(C )
- 带有 #include< iostream.h> 的程序允许使用 strlen() 等字符串函数。为什么?