我需要实现自己的strlcat()函数,这是标准C库中的一个函数,用于操作字符串。
size_t strlcat(char * restrict dst, const char * restrict src, size_t size);
关于它的工作方式,我有两个问题:
在每种情况下,它是否NUL_终止dst
?
我的man页上写着:
strlcat()使用缓冲区的完整大小(而不仅仅是长度),并保证将结果NUL结尾(只要size大于0或者在strlcat()的情况下,dst中至少还有一个字节的空闲)。
并且:
strlcat()函数将NUL结尾字符串src附加到dst的末尾。它最多附加size - strlen(dst) - 1字节,并在结尾处添加NUL。
但也有这样的描述:
请注意,如果strlcat()查找size个字符而没有找到NUL,则认为字符串的长度为size,并且目标字符串将不会NUL结尾(因为没有空间放置NUL)。
那么,在每种情况下,我是否需要NUL_终止dst?
一方面,它说有一种情况下dst
字符串不是NUL_终止的。
另一方面,手册说strlcat()
保证dst
将被NUL_终止,而不NUL_终止的字符串会很不安全,不是吗?
请问有人能举个例子吗?
返回值代表什么?为什么会有这种行为?
这里是我进行一些测试时得到的结果:
Before : || After :
dst | src | size || dst | return
------------------------||--------------------
dst\0 | src\0 | 0 || dst\0 | 3
dst\0 | src\0 | 1 || dst\0 | 4
dst\0 | src\0 | 2 || dst\0 | 5
dst\0 | src\0 | 3 || dst\0 | 6
dst\0 | src\0 | 4 || dst\0 | 6
dst\0 | src\0 | 5 || dsts\0 | 6
dst\0 | src\0 | 6 || dstsr\0 | 6
dst\0 | src\0 | 7 || dstsrc\0 | 6
dst\0 | src\0 | 8 || dstsrc\0 | 6
再次来自这位先生:
[strlcat()函数]返回它试图创建的字符串的总长度。对于strlcat()函数,这意味着dst的初始长度加上src的长度。
在我的测试中,dst
和src
的大小是恒定的(3和3)。那么为什么有时返回值与6不同?
难道不应该是(len(dst) + min(size, len(src))
吗?
size代表什么?
strlcat()函数将以NUL结尾的字符串src附加到dst的末尾。它最多会附加size - strlen(dst) - 1字节,以NUL结尾的结果。
所以,size应该是允许dst
末尾的长度(包括'\0'字符)吗?是这样吗?
strlcat
不在标准 C 中。 - M.Mman strlcat
,在“库部分”中会有这个:标准C库(libc,-lc)。 - vmonteco