You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义string类compare方法逻辑异常,编译无错但判断不符合预期求助

解决自定义String类Compare方法逻辑错误的问题

我之前自定义string类的时候也踩过一模一样的坑!你遇到的问题大概率是直接比较了char指针的内存地址,而不是逐字符对比字符串内容——编译不会报错,但逻辑完全不符合预期,哪怕两个字符串内容不同,只要指针地址巧合相同(比如指向同一个常量字符串),就会误判为相等。

常见错误原因

  • 直接对比指针而非内容:如果你的compare方法里写了类似if (this->data == other.data)的代码,这只是在比较两个指针指向的内存地址,不是字符串的实际内容。比如两个不同的char数组如果被不小心指向了同一块内存(比如构造函数没正确复制字符串),就会出现内容不同但判断相等的情况。
  • 逐字符对比逻辑不完整:比如只对比了第一个字符就返回结果,或者没处理其中一个字符串更长的情况(比如"abc"和"abcd",前面字符相同但长度不同,应该判断为不相等)。

修复方案:正确实现Compare方法

下面是一个标准的compare方法实现,同时附带重载==运算符的版本,方便你在main里直接用if判断:

#include <cstring> // 需要用到strlen、strcpy

class MyString {
private:
    char* data;

public:
    // 正确的构造函数:复制传入的字符串内容,而非直接赋值指针
    MyString(const char* str = nullptr) {
        if (str == nullptr) {
            // 处理空字符串
            data = new char[1];
            data[0] = '\0';
        } else {
            size_t length = strlen(str);
            data = new char[length + 1]; // 留位置存结束符'\0'
            strcpy(data, str);
        }
    }

    // 析构函数:记得释放内存,避免内存泄漏
    ~MyString() {
        delete[] data;
    }

    // 核心:正确的compare方法
    int compare(const MyString& other) const {
        const char* str1 = this->data;
        const char* str2 = other.data;

        // 逐字符对比,直到遇到结束符或不同字符
        while (*str1 != '\0' && *str2 != '\0') {
            if (*str1 != *str2) {
                // 返回字符差值:正数表示当前字符串更大,负数更小,0表示相等
                return *str1 - *str2;
            }
            str1++;
            str2++;
        }

        // 处理其中一个字符串更长的情况(比如"abc" vs "abcd")
        return *str1 - *str2;
    }

    // 重载==运算符,方便直接判断相等
    bool operator==(const MyString& other) const {
        return this->compare(other) == 0;
    }

    // 可选:重载!=运算符
    bool operator!=(const MyString& other) const {
        return !(*this == other);
    }
};

测试示例

在main函数里可以这样测试:

int main() {
    MyString str1("hello");
    MyString str2("world");
    MyString str3("hello");

    if (str1 == str2) {
        // 这部分不应该执行,因为内容不同
        printf("str1和str2相等\n");
    } else {
        printf("str1和str2不相等\n"); // 应该输出这个
    }

    if (str1 == str3) {
        printf("str1和str3相等\n"); // 应该输出这个
    }

    return 0;
}

关键注意点

  1. 构造函数必须复制字符串内容:绝对不能直接把传入的char*赋值给类的data成员,否则多个MyString对象会共享同一块内存,修改其中一个会影响其他对象,还会导致compare时误判地址相等。
  2. 记得释放内存:一定要写析构函数delete[] data,避免内存泄漏。
  3. 处理空字符串情况:构造函数要考虑传入nullptr的情况,避免访问非法内存。

内容的提问来源于stack exchange,提问作者Biorecepto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:43:01