C语言自定义String结构体实现深拷贝与字符串比较功能求助
自定义String函数问题修复方案
问题汇总
copy_string 现有问题
- 合法性校验时机错误:先操作target指针后才判断target->letters是否为空,空指针场景会直接触发崩溃
- 未释放target原有内存:直接覆盖target->letters指针会导致原有堆内存泄漏
- 未为target分配匹配长度的内存:如果source长度大于target原有长度,会触发缓冲区溢出
- 赋值逻辑顺序错误:修改target->count前就用旧的count值写'\0',结束符写入位置错误
- 缺少参数空校验:未判断target、source结构体指针本身是否为空
compare_string 现有问题
- 指针操作逻辑完全错误:移动的是String结构体指针而非字符数组指针,且结构体指针本身被const修饰不可修改,直接触发编译报错
- 比较逻辑错误:循环条件判断的是字符数组的指针地址而非指向的字符内容,完全不符合ASCII比较要求
- 返回值逻辑错误:返回两个字符数组的指针地址差,而非字符ASCII差值,和strcmp行为完全不一致
- 未处理字符串长度不一致的场景:比如"cat"和"category"前缀相同但长度不同的情况无法正确判断
优化后实现代码
copy_string 实现
#include <stdlib.h> // 需引入该头文件使用malloc、free int32_t copy_string(String* const target, const String* const source) { // 先做参数合法性校验 if (target == NULL || source == NULL || source->letters == NULL) { return -1; } // 释放target原有内存,避免泄漏 if (target->letters != NULL) { free(target->letters); target->letters = NULL; } // 给target分配新的内存空间,长度为source->count + 1(存结束符) target->letters = (char*)malloc(sizeof(char) * (source->count + 1)); if (target->letters == NULL) { return -2; } // 逐个拷贝字符,包括结束符 uint32_t i = 0; while (i <= source->count) { target->letters[i] = source->letters[i]; i++; } // 同步count值 target->count = source->count; return target->count; }
compare_string 实现
int32_t compare_string(const String* const first, const String* const second) { // 参数合法性校验 if (first == NULL || second == NULL || first->letters == NULL || second->letters == NULL) { // 空指针规则可自行调整,此处默认空指针视为小于非空 if (first == NULL || first->letters == NULL) return -1; return 1; } // 用临时字符指针遍历,不修改原结构体指针 const char* p_first = first->letters; const char* p_second = second->letters; // 逐个比较字符直到出现差异或其中一个到结尾 while (*p_first != '\0' && *p_second != '\0' && *p_first == *p_second) { p_first++; p_second++; } // 计算差值,和strcmp行为完全对齐 int32_t diff = (int32_t)*p_first - (int32_t)*p_second; if (diff != 0) { return diff; } // 前缀完全相同的情况下,比较长度 return (int32_t)first->count - (int32_t)second->count; }
该实现完全符合预期:"cat"和"elephant"比较时,第一个字符'c'(ASCII 99) < 'e'(ASCII 101),直接返回负值
内容的提问来源于stack exchange,提问作者mainland3r
相关产品推荐
相关产品推荐

