Why unsigned int and not a void for strlcat and strlcpy?
我不明白为什么我们必须为
感谢您的回覆
这些函数的目的是(以某种方式)移动字符串,而程序员在执行此操作时经常会问的一个问题是"移动了多少个字符?"。
由于它已经知道此信息,因此不再需要返回此信息。否则,程序员将不得不在之前和/或之后做一些昂贵的strlen()。
另外,如果由于缓冲区太小而失败,它们会为您提供所需的字符数,因此您可以检测到截断并潜在地重新分配缓冲区。
这些函数在
1 2 | size_t strlcpy(char *dst, const char *src, size_t size); size_t strlcat(char *dst, const char *src, size_t size); |
-
dst 是指向目标数组的指针。该数组必须包含用于strlcat 的有效C字符串,如果size 为0 ,则它可以为NULL 。 -
src 必须是指向C字符串的有效指针。 -
size 是目标数组的大小(以字节为单位)。
该函数执行字符串复制或连接,类似于
如果目标数组足够长,则这两个函数都将返回结果字符串的长度(以字节为单位)。这样可以很容易地检测到截断。
这是一个例子:
1 2 3 4 5 6 7 8 | char dest[10]; size_t len = strlcpy(dest,"This is a random string", sizeof dest); if (len >= sizeof dest) { /* Truncation occurred. You could ignore it, issue a diagnostic, or reallocate the destination array to at least `len+1` bytes */ printf("Truncation occurred\ "); } |
因此,这是您问题的答案:如果程序员想要检测截断,则返回值很有用,否则可以安全地忽略它。
1 2 3 4 5 6 | #include <string.h> size_t strlcpy(char *dst, const char *src, size_t size); size_t strlcat(char *dst, const char *src, size_t size); |
他们尝试创建的字符串。对于
对于
但是请注意,如果
NUL,则字符串的长度被认为是大小,并且目标字符串将不会以NUL终止(因为
NUL)。这样可以防止
实践中这不应该发生(因为这意味着大小错误或dst不是正确的``C''字符串)。存在该检查是为了防止错误代码中的潜在安全问题。