为什么不考虑将 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 专门用于查找字符串长度的界面。
函数 strdup()
和 strndup()
终于进入了即将发布的 C23 标准:
7.24.6.4 The
strdup
functionSynopsis
#include <string.h> char *strdup(const char *s);
The
strdup
function creates a copy of the string pointed to bys
in a space allocated as if by a call tomalloc
.Returns
Thestrdup
function returns a pointer to the first character of the duplicate string. The returned pointer can be passed tofree
. If no space can be allocated thestrdup
function returns a null pointer.7.24.6.5 The
strndup
functionSynopsis
#include <string.h> char *strndup(const char *s, size_t size);
The
strndup
function creates a string initialized with no more thansize
initial characters of the array pointed to bys
and up to the first null character, whichever comes first, in a space allocated as if by a call tomalloc
. If the array pointed to bys
does not contain a null within the firstsize
characters, a null is appended to the copy of the array.Returns
Thestrndup
function returns a pointer to the first character of the created string. The returned pointer can be passed tofree
. If no space can be allocated thestrndup
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 专门用于查找字符串长度的界面。