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

自行实现的strlcpy()函数返回值与官方版本不一致问题

问题分析

你的实现核心错误在于没有计算源字符串src的完整长度作为返回值,strlcpy的返回值定义是固定的strlen(src),和传入的len参数、实际拷贝的字符数无关,和你输出的dst内容是否正确也没有关系。

具体存在两处问题:

  • 返回值逻辑完全不符合接口定义
    你当前返回的i+1完全和len参数绑定,i的最大值就是len-1,所以你返回的数值本质是len,完全没有统计src本身的总长度。你测试时官方接口返回10,说明你测试用的src实际总长度就是10(你描述的src = "string"属于笔误),自然和你返回的6不匹配。
  • 边界case存在崩溃风险
    当传入的len为0时,你的代码会执行len - 1得到无符号整数的最大值,循环会进入非法遍历,同时你还会执行*dst = '\0'写入非法地址,直接引发段错误。
修复后的参考实现
#include <stddef.h> // 引入标准类型size_t的定义

size_t ft_strlcpy(char *dst, const char *src, size_t len)
{
    size_t src_len = 0;
    // 优先统计完整的源字符串长度,不受len参数影响
    while (src[src_len] != '\0')
        src_len++;

    // 处理len为0的边界情况,不写入任何字符直接返回src长度
    if (len == 0)
        return src_len;

    size_t i = 0;
    while (i < len - 1 && src[i] != '\0')
    {
        dst[i] = src[i];
        i++;
    }
    dst[i] = '\0';

    // 始终返回源字符串的完整长度
    return src_len;
}
补充说明
  • 你原有实现的拷贝逻辑是正确的,这也是你测试时dst内容和官方接口一致的原因,唯一偏差就是返回值的统计规则。strlcpy返回源字符串总长度的设计目的是让调用者可以快速判断截断:只要返回值 >= 传入的len,就说明dst中存储的是截断后的字符串。
  • 标准strlcpy的参数和返回值类型都是标准定义的size_t,你原有实现混用long unsigned int和unsigned int在部分平台会出现类型不兼容的问题,建议统一使用size_t。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:15:03