我不明白为什么我们必须为unsigned int
和strlcat
返回strlcpy
,为什么我们需要它?这不是功能的目的。
感谢您的答复
答案 0 :(得分:7)
这些功能的目的是(以某种方式)移动字符串,并且当您这样做时,程序员经常问的一个问题是“移动了多少个字符?”。
由于它已经知道此信息,因此不再需要返回此信息。否则,程序员将不得不在之前和/或之后进行一些昂贵的strlen()操作。
此外,如果由于缓冲区太小而导致失败,它们会为您提供所需的字符数,因此您可以检测到截断并可能重新分配缓冲区。
答案 1 :(得分:3)
strlcpy
和strlcat
是Unix的某些BSD版本上可用的非标准功能,这些功能执行安全的strcpy
和strcat
截断的安全版本。它们实际上并不返回unsigned int
,而是返回size_t
返回的类型sizeof
,并且可能与unsigned int
不同。
这些原型在<string.h>
中声明了这些函数:
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字符串,如果NULL
为size
,则可以为0
。src
必须是指向C字符串的有效指针。size
是目标数组的大小(以字节为单位)。该函数执行字符串复制或连接,类似于strcpy
和strcat
,但写操作不会超出目标数组(size
)的末尾。除非size
为0
或dst
指向size
的前strlcat
个字节中没有空终止符的数组,否则它们将终止目标数组。>
如果目标数组足够长,则两个函数都将返回结果字符串的长度(以字节为单位)。这样可以很容易地检测到截断。
这里是一个例子:
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\n");
}
因此,这是您的问题的答案:如果程序员想要检测截断,则返回值很有用,否则可以安全地忽略它。
答案 2 :(得分:2)
strlcpy()
和strlcat()
的简介
#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);
strlcpy()
和strlcat()
函数返回
他们尝试创建的字符串。对于strlcpy()
,这意味着src
的长度。
对于strlcat()
,这意味着dst
的初始长度加上的长度
src
。尽管这似乎有些令人困惑,但这样做是为了简化截断检测。
但是请注意,如果strlcat()
遍历大小字符而没有找到
NUL,则字符串的长度被视为大小,并且目标字符串将不会以NUL终止(因为没有空格
NUL)。这样可以防止strlcat()
从字符串末尾开始运行。在
练习这不应该发生(因为这意味着大小错误或dst不是正确的``C''字符串)。存在该检查是为了防止使用不正确的代码引起潜在的安全问题。