Почему strnlen() не рассматривается для включения в C23?
Функции
strdup()
а также
strndup()
наконец-то попали в грядущий стандарт C23:
7.24.6.4 Функция
Синопсис
#include <string.h> char *strdup(const char *s);
Функция создает копию строки, на которую указывает , в пространстве, выделенном как при вызове .
Возвращает
Функция возвращает указатель на первый символ повторяющейся строки. Возвращаемый указатель может быть передан в . Если место не может быть выделено,strdup
функция возвращает нулевой указатель.7.24.6.5 Функция
Синопсис
#include <string.h> char *strndup(const char *s, size_t size);
Функция создает строку, инициализированную не более чем начальными символами массива, на который указывает и вплоть до первого нулевого символа, в зависимости от того, что наступит раньше, в пространстве, выделенном как при вызове
malloc
. Если массив, на который указывает не содержит null в пределах первогоsize
символов, к копии массива добавляется нуль.Возвращает
Функция возвращает указатель на первый символ созданной строки. Возвращаемый указатель может быть переданfree
. Если место не может быть выделено,strndup
функция возвращает нулевой указатель.
Почему функция POSIX-2008
strnlen
не рассматривается для включения?
#include <string.h>
size_t strnlen(const char *s, size_t maxlen);
Функция должна вычислять меньшее из числа байтов в массиве, на который указывает, не включая завершающий символ NUL, или значение аргумента. В
strnlen()
функция никогда не должна проверять более
maxlen
байтов массива, на который указывает
s
.
2 ответа
Интересно, что эта функция была предложена в 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, добавьте strnlen в C2X [N 2351]
...
*Необоснованный опрос: стоит ли включать N2351 в C2X?
(11/6/6)
Не четкий консенсус.
В результате функция не добавилась.
Одним из аргументов против является то, что это лишняя функция, так как у нас уже есть . Пример:
const char str[666] = "hello world";
size_t length1 = strnlen(str,666);
size_t length2 = (char*)memchr(str,'\0',666) - str;
Преимущества :
- Уже была стандартной функцией C с незапамятных времен.
- Возможно, более эффективно, чем в некоторых ситуациях (?).
- Более универсальный API.
-
memchr
уже должен использоваться для очистки предполагаемого строкового ввода перед вызовом таких функций, какstrcpy
, так что какую цель наполняет непонятно. - Имеет правильную обработку ошибок, в отличие от
strnlen
который не говорит, если он потерпел неудачу или нет.
Недостатки:
- Более неудобный и небезопасный интерфейс для определения длины строки.