自行实现的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
相关产品推荐
相关产品推荐

