为什么不考虑将 strnlen() 包含在 C23 中?

Why is strnlen() not considered for inclusion in C23?

函数 strdup()strndup() 终于进入了即将发布的 C23 标准:

7.24.6.4 The strdup function

Synopsis

#include <string.h>
char *strdup(const char *s);

The strdup function creates a copy of the string pointed to by s in a space allocated as if by a call to malloc.

Returns
The strdup function returns a pointer to the first character of the duplicate string. The returned pointer can be passed to free. If no space can be allocated the strdup function returns a null pointer.

7.24.6.5 The strndup function

Synopsis

#include <string.h>
char *strndup(const char *s, size_t size);

The strndup function creates a string initialized with no more than size initial characters of the array pointed to by s and up to the first null character, whichever comes first, in a space allocated as if by a call to malloc. If the array pointed to by s does not contain a null within the first size characters, a null is appended to the copy of the array.

Returns
The strndup function returns a pointer to the first character of the created string. The returned pointer can be passed to free. If no space can be allocated the strndup function returns a null pointer.

为什么不考虑包含 POSIX-2008 函数 strnlen

#include <string.h>
size_t strnlen(const char *s, size_t maxlen);

strnlen() 函数应计算 s 指向的数组中字节数中较小的一个,不包括终止 NUL 字符,或 maxlen 的值争论。 strnlen() 函数永远不会检查 s.

指向的数组的超过 maxlen 个字节

有趣的是,这个功能是在https://www9.open-std.org/JTC1/SC22/WG14/www/docs/n2351.htm

中提出的

2019年伦敦会议上讨论过。见议程: https://www9.open-std.org/JTC1/SC22/WG14/www/docs/n2370.htm

可以在 https://www9.open-std.org/JTC1/SC22/WG14/www/docs/n2377.pdf 找到讨论记录。 第 59 页。

未达成共识被拒

6.33 Sebor, Add strnlen to C2X [N 2351]

...

*Straw poll: Should N2351 be put into C2X?

(11/6/6)

Not clear consensus.

因此没有添加该功能。

反对 strnlen 的一个论点是它是一个多余的函数,因为我们已经有了 memchr。示例:

const char str[666] = "hello world";
size_t length1 = strnlen(str,666);
size_t length2 = (char*)memchr(str,'[=10=]',666) - str;

memchr的优点:

  • 从一开始就已经是标准的 C 函数。
  • 在某些情况下可能比 strnlen 更有效(?)。
  • 更通用API。
  • memchr 应该已经用于在调用像 strcpy 这样的函数之前清理假定的字符串输入的目的,所以 strnlen 填充的目的尚不清楚。
  • 有正确的错误处理,不像 strnlen 不告诉它是否失败。

缺点:

  • 更笨拙和 type-unsafe 专门用于查找字符串长度的界面。