gpt4 book ai didi

c - strlcat() : is dst always NUL_terminated? "size"和返回值是什么?

转载 作者:行者123 更新时间:2023-11-30 15:16:20 25 4
gpt4 key购买 nike

我必须从标准 C 库实现我自己版本的 strlcat() 函数。

size_t     strlcat(char * restrict dst, const char * restrict src, size_t size);

我有两个关于它如何工作的问题:

在任何情况下都会 NUL_terminate dst 吗?

在我的男人中,我有以下几点:

strlcat() take the full size of the buffer (not just the length) and guarantee to NUL-terminate the result (as long as size is larger than 0 or, in the case of strlcat(), as long as ther is at least one byte free in dst).

和:

The strlcat() function appends the NUL-terminated string src to the end of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-terminating the result.

而且:

Note however, that if strlcat() traverses size characters without finding a NUL, the length of the string is considered to be size and the destination string will not be NUL-terminated (since there was no space for the NUL).

那么,我应该在每种情况下都 NUL_terminate dst 吗?一方面,它表示存在 dst 字符串不是 NUL_termination 的情况。另一方面,该人说 strlcat() 保证 dst 将以 NUL_terminate 结尾,并且非 NUL_terminate 字符串不是非常不安全吗?

有人能给我一个发生这种情况的例子吗?

返回值代表什么以及为什么会出现这种行为?

以下是我通过一些测试得到的结果:

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

再次来自男人:

[The strlcat() function] return the total length of the string [it tries] to create. For strlcat() that means the initial length of dst plus the length of src.

dstsrc 的大小在我的测试中保持不变(3 和 3)。那么为什么会出现返回值与6不同的情况呢?

这不是(len(dst) + min(size, len(src))吗?

尺寸代表什么?

The strlcat() function appends the NUL-terminated string src to the end of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-terminating the result.

那么 size 应该是最后允许的长度(包括 '\0' 字符)dst 吗?是这样吗?

最佳答案

1。 strlcat 总是以 null 终止 dst 吗?

如果 strlcat 修改 dst

dst 将以 null 终止于 strlcat。如果 dst 已完全占用,Strlcat 不会修改 dst。如果在 dst 的前 size - 1 字节中未找到 NUL,则认为 dst 已完全占用(或者如果大小为0)。

因此,有两种情况 dst 不会被 strlcat 以 null 终止。其一是 dst 是一个正好 size - 1 字节的空终止字符串,在这种情况下,它不会被修改并继续以空终止。第二种情况是 dst 最初不是以 null 终止的,在这种情况下,在调用 strlcat 后它仍然不会终止。

2。原始目标字符串的长度是如何测量的?

size 预计为包含 dst 的内存区域的大小,因此 dst[size] 被假定为无效内存引用。因此,如果 dst 作为有效(因此以 null 结尾)字符串开始,则其长度将严格小于 size 并且 strlcat 将使用 strlen(dst) 作为其长度。如果dst 无效,则出于返回值的目的,其大小被假定为size。在这种情况下,dst 将不会被修改。见上文。

关于c - strlcat() : is dst always NUL_terminated? "size"和返回值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com