使用C99的新含义静止的
关键词:
如果我们改变参数,我们可以:
ssize_t ft_strscpy(大小_大小,char dst[限制静态大小],const char src[限制静态大小]);
现在如果我们这样称呼它:
int main(无效){字符buf[10]={};ft_strscpy(10,buf,“feo”);}
编译器很好地输出了一些诊断信息:
c.c:在函数“main”中:c.c:26:5:警告:“ft_strscpy”正在从大小为4的区域读取5个字节[-Wstringop-overread]26|ft_strscpy(5,buf,“feo”);| ^~~~~~~~~~~~~~~~~~~~~~~~~c.c:26:5:注意:引用“const char[]”类型的参数3抄送:3:9:注意:在调用函数'ft_strscpy'时3|ssize_t ft_strscpy(size_t大小,| ^~~~~~~~~~
它也更具有自我记录功能,并且限制
可能允许编译器更好地优化函数,因为它可以假定两个指针没有别名。
缺少单元测试:
我们可以测试一些东西:
- 函数是否正确返回复制的字节数?
- 功能是否返回
-E2BIG公司
如果目标缓冲区不够大?
- 函数返回后,两个字符串比较是否相等?
您不需要为此提供测试库/框架。使用资产()
从<断言.h>
.
我注意到函数返回了-E2BIG,它扩展到-7而不是通常的-1,我习惯于看到错误返回。
你对此有何感想?
如果我试图实施,我的感受是无关紧要的strscpy(9)
符合规范要求在这里.
如果你不喜欢回来-E2BIG公司
,您可以返回其他内容,但它将不再是strscpy()
,指定返回-E2BIG公司
,但应在文档中指定修改后的版本。
请参见:为什么返回负错误号?(例如退货-EIO).
噪音:
返回
不需要任何括号。更改此选项:
返回(-E2BIG);...收益(cnt);
收件人:
返回-E2BIG;...返回cnt;
使用有意义的标识符:
碳纳米管
不如计数
至少它读起来和听起来都不像粗俗的俚语。
在声明点初始化变量:
size_t cnt;if(!大小)返回(-E2BIG);cnt=0;
没有分配的理由cnt=0
离它的宣言还很远。考虑:
size_t cnt=0;
这就是我要实现的ft_strscpy()
:
#包括<errno.h>#包括<string.h>ssize_t ft_strscpy(大小_大小,char dst[限制静态大小],const char src[限制静态大小]){如果(大小==0){返回-E2BIG;}void*const res=内存副本(dst,src,'\0',大小);返回res!=空指针?(res-dst-1):(dst[size-1]='\0',-E2BIG);}
我已经改变了参数。如果您希望遵守规范,那么应该使用与代码中相同的原型。虽然其他人可能会对逗号操作符的使用感到不悦,但我觉得这里没问题。
有关的详细信息内存复制()
,请参阅:memccpy(3)
-Linux手册页。它是C23的一部分。
如果你问我,它呈现strncpy()
,strlcpy()
,strscpy()
,stpcpy()
,strcpy_s()
,字符串_()
和其他变体几乎毫无用处。至少strncpy()
现在终于可以死了。