为什么strlcat和strlcpy使用无符号int而不是空值?

为什么strlcat和strlcpy使用无符号int而不是空值?,c,string,strlcpy,C,String,Strlcpy,我不明白为什么我们必须为strlcat和strlcpy返回unsigned int,为什么我们需要它?这不是函数的目的 感谢您的回答这些函数的目的是移动字符串(以某种方式),程序员经常问您这样做的问题是“移动了多少个字符?” 由于它已经知道此信息,因此返回此信息不再是它的工作。否则,程序员将不得不在之前和/或之后执行一些昂贵的strlen() 此外,如果它们由于缓冲区太小而失败,它们会提供所需的字符数,因此您可以检测到截断,并可能重新分配缓冲区。这些函数的目的是移动字符串(以某种方式),当您这样

我不明白为什么我们必须为
strlcat
strlcpy
返回
unsigned int
,为什么我们需要它?这不是函数的目的


感谢您的回答

这些函数的目的是移动字符串(以某种方式),程序员经常问您这样做的问题是“移动了多少个字符?”

由于它已经知道此信息,因此返回此信息不再是它的工作。否则,程序员将不得不在之前和/或之后执行一些昂贵的strlen()


此外,如果它们由于缓冲区太小而失败,它们会提供所需的字符数,因此您可以检测到截断,并可能重新分配缓冲区。

这些函数的目的是移动字符串(以某种方式),当您这样做时,程序员经常会问“移动了多少个字符?”

由于它已经知道此信息,因此返回此信息不再是它的工作。否则,程序员将不得不在之前和/或之后执行一些昂贵的strlen()

此外,如果由于缓冲区太小而失败,它们会提供所需的字符数,因此您可以检测到截断,并可能重新分配缓冲区。

strlcpy()和
strlcat()

#包括
尺寸
strlcpy(char*dst,const char*src,size\u t size);
尺寸
strlcat(char*dst,const char*src,size\u t size);
strlcpy()
他们试图创建的字符串。对于
strlcpy()
,表示
src
的长度。 对于
strlcat()
,这意味着
dst的初始长度加上
src
。虽然这似乎有点令人困惑,但它是为了使截断检测变得简单

但是请注意,if
strlcat()
遍历大小字符时没有找到 如果是NUL,则字符串的长度被视为大小,并且目标字符串不会以NUL结尾(因为没有空间用于 努尔)。这可以防止
strlcat()。在里面
实践中不应出现这种情况(因为这意味着大小不正确或dst不是正确的“C”字符串)。该检查旨在防止错误代码中的潜在安全问题。

strlcpy()
strlcat()

#包括
尺寸
strlcpy(char*dst,const char*src,size\u t size);
尺寸
strlcat(char*dst,const char*src,size\u t size);
strlcpy()
他们试图创建的字符串。对于
strlcpy()
,表示
src
的长度。 对于
strlcat()
,这意味着
dst的初始长度加上
src
。虽然这似乎有点令人困惑,但它是为了使截断检测变得简单

但是请注意,if
strlcat()
遍历大小字符时没有找到 如果是NUL,则字符串的长度被视为大小,并且目标字符串不会以NUL结尾(因为没有空间用于 努尔)。这可以防止
strlcat()。在里面

实践中不应出现这种情况(因为这意味着大小不正确或dst不是正确的“C”字符串)。存在此检查是为了防止错误代码中存在潜在的安全问题。

strlcpy
strlcat
是Unix的某些BSD版本上可用的非标准函数,它们执行带截断的安全版本的
strcpy
strcat
。它们实际上不返回
无符号整数
,而是返回
大小
,这是
sizeof
返回的类型,可能与
无符号整数
不同

函数在
中声明,具有以下原型:

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
    是目标数组的大小(以字节为单位)
这些函数执行字符串复制或串联,类似于
strcpy
strcat
,但不会写入目标数组的末尾(
size
)。除非
size
0
dst
指向
strlcat
的第一个
size
字节中没有空终止符的数组,否则它们将以空终止目标数组

如果目标数组足够长,这两个函数都返回结果字符串的长度(字节)。这允许轻松检测截断

以下是一个例子:

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");
}

下面是您问题的答案:如果程序员想要检测截断,那么返回值很有用,否则,它可能会被安全地忽略。

strlcpy
strlcat
是一些BSD版本的Unix上可用的非标准函数,这些函数执行带截断的安全版本的
strcpy
strcat
。它们实际上不返回
无符号整数
,而是返回
大小
,这是
sizeof
返回的类型,可能与
无符号整数
不同

函数在
中声明,具有以下原型:

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
    是目标数组的大小(以字节为单位)