Почему 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который не говорит, если он потерпел неудачу или нет.

Недостатки:

  • Более неудобный и небезопасный интерфейс для определения длины строки.
Другие вопросы по тегам