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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:09:03