1

我不明白为什么我们必须返回一个unsigned intforstrlcatstrlcpy,为什么我们需要它?这不是该功能的目的。

感谢您的回复

4

3 回答 3

7

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

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

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

于 2018-08-17T20:47:27.830 回答
3

strlcpy并且strlcat是在某些 BSD 版本的 Unix 上可用的非标准函数,它们执行安全版本strcpystrcat带有截断。它们实际上并不返回 a unsigned int,而是 a 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是指向目标数组的指针。这个数组必须包含一个有效的 C 字符串 for strlcat,它可以是NULLif sizeis 0
  • src必须是指向 C 字符串的有效指针。
  • size是目标数组的字节大小。

这些函数执行字符串复制或连接,类似于strcpyand strcat,但不会超出目标数组 ( size) 的末尾。它们以 null 终止目标数组,除非sizeis0dst指向在第一个size字节中没有 null 终止符的数组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");
}

因此,这是您问题的答案:如果程序员想要检测截断,则返回值很有用,否则可以安全地忽略它。

于 2018-08-18T15:03:28.403 回答
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()andstrlcat()函数返回他们尝试创建的字符串的总长度。因为strlcpy()这意味着 的长度src。因为strlcat()这意味着初始长度dst加上 的长度 src。虽然这看起来有些令人困惑,但这样做是为了简化截断检测。

但是请注意,如果strlcat()遍历 size 个字符而没有找到 NUL,则字符串的长度被认为是 size 并且目标字符串不会以 NUL 终止(因为 NUL 没有空间)。这可以strlcat()防止跑出字符串的末尾。实际上,这不应该发生(因为这意味着大小不正确或 dst 不是正确的“C”字符串)。存在检查是为了防止错误代码中的潜在安全问题。

于 2018-08-17T20:54:57.037 回答