如何解决C++ 运行时错误:添加无符号偏移量?
我写了以下内容来检查文本是否为回文,我在 leetcode 上运行它,但出现错误:
class Solution {
public:
bool ispalindrome(string s) {
int l=0,r=s.length()-1;
while(l<r)
{
while (!isalpha(s[r]))
{
--r;
}
while (!isalpha(s[l]))
{
++l;
}
if (tolower(s[r])!=tolower(s[l]))
return false;
--r;
++l;
}
return true;
}
};
第 1061 行:字符 9:运行时错误:将无符号偏移添加到 0x7ffc7cc10880 溢出到 0x7ffc7cc1087f (basic_string.h) 总结: UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/basic_string.h:1070:9
我的代码有什么问题?
解决方法
你在这里越界了:
while (!isalpha(s[r]))
这里
while (!isalpha(s[l]))
r
可以变为负数,而 l
可以变为 >= s.length()
。
您应该添加一些检查,例如
while (l < r && !isalpha(s[r]))
和
while (l < r && !isalpha(s[l]))
这一行同样的问题
if (tolower(s[r])!=tolower(s[l]))
应该是
if (l < r && tolower(s[r])!=tolower(s[l]))
不同的方法 (C++20)
另一种方法是用
擦除s
中的所有非字母字符
std::erase_if(s,[](char c) { return !isalpha(c); });
并删除内部的 while 循环。
,我认为您非常接近解决方案。这里的陷阱是:
- 您在循环中多次修改循环控制变量
- (因此)您在更改其值后使用循环控制变量而无需进一步检查。
解决此类问题的简单方法是对每次迭代执行一个操作。您只需使用“else”即可实现此目的。
class Solution {
public:
bool isPalindrome(string s) {
int l=0,r=s.length()-1;
while(l<r)
{
if(!isalpha(s[r]))
{
--r;
}
else if(!isalpha(s[l]))
{
++l;
}
else if (tolower(s[r])!=tolower(s[l]))
{
return false;
}
else
{
--r;
++l;
}
}
return true;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。