微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 运行时错误:添加无符号偏移量?

如何解决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 举报,一经查实,本站将立刻删除。