自定义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; }
关键注意点
- 构造函数必须复制字符串内容:绝对不能直接把传入的
char*赋值给类的data成员,否则多个MyString对象会共享同一块内存,修改其中一个会影响其他对象,还会导致compare时误判地址相等。 - 记得释放内存:一定要写析构函数
delete[] data,避免内存泄漏。 - 处理空字符串情况:构造函数要考虑传入
nullptr的情况,避免访问非法内存。
内容的提问来源于stack exchange,提问作者Biorecepto
相关产品推荐
相关产品推荐

