Почему unsigned int, а не пустота для strlcat и strlcpy?

Я не понимаю, почему мы должны вернуть unsigned int за strlcat а также strlcpyзачем нам это? это не цель функции.

Спасибо за ваши ответы

3 ответа

Целью этих функций является перемещение строк (в некотором роде), и очень часто программист задает вопрос: "Сколько символов было перемещено?".

Поскольку он уже знает эту информацию, ему больше не нужно возвращать эту информацию. В противном случае программист должен был бы сделать несколько дорогих strlen() до и / или после.

Кроме того, если они терпят неудачу из-за слишком маленького буфера, они дают вам необходимое количество символов, чтобы вы могли обнаружить усечение и потенциально перераспределить буфер.

strlcpy а также strlcat являются нестандартными функциями, доступными в некоторых версиях Unix для BSD, которые выполняют безопасную версию strcpy а также strcat с усечением. Они на самом деле не возвращают unsigned int, но size_t, который является типом, возвращаемым sizeof и может отличаться от unsigned int,

Функции объявлены в <string.h> с этими прототипами:

size_t strlcpy(char *dst, const char *src, size_t size);
size_t strlcat(char *dst, const char *src, size_t size);
  • dst указатель на массив назначения Этот массив должен содержать допустимую строку C для strlcat, может быть NULL если size является 0,
  • src должен быть действительным указателем на строку C.
  • size размер в байтах целевого массива.

Функции выполняют копирование или объединение строк, аналогично strcpy а также strcat, но не пишите за пределами конечного массива (size). Они нулевые завершают массив назначения, если size является 0 или же dst указывает на массив без нулевого терминатора в первом size байты для strlcat,

Обе функции возвращают длину в байтах результирующей строки, если целевой массив был достаточно длинным. Это позволяет легко обнаруживать усечение.

Вот пример:

char dest[10];
size_t len = strlcpy(dest, "This is a random string", sizeof dest);
if (len >= sizeof dest) {
    /* Truncation occurred. You could ignore it, issue a diagnostic,
       or reallocate the destination array to at least `len+1` bytes */
    printf("Truncation occurred\n");
}

Итак, вот ответ на ваш вопрос: возвращаемое значение полезно, если программист хочет обнаружить усечение, иначе оно может быть безопасно проигнорировано.

Синопсис strlcpy() а также strlcat()

#include <string.h>
size_t
strlcpy(char *dst, const char *src, size_t size);

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

strlcpy() а также strlcat() функции возвращают общую длину строки, которую они пытались создать. За strlcpy() это означает, что длина src, За strlcat() это означает, что начальная длина dst плюс длинаsrc, Хотя это может показаться несколько запутанным, это было сделано, чтобы упростить обнаружение усечения.

Обратите внимание, что если strlcat() Обходит символы размера, не находя NUL, длина строки считается размером, и строка назначения не будет заканчиваться NUL (так как для NUL не было места). Это держит strlcat() от бега от конца строки. На практике это не должно происходить (поскольку это означает, что либо размер неверен, либо dst не является правильной строкой ``C''). Проверка существует для предотвращения потенциальных проблем безопасности в неправильном коде.

Другие вопросы по тегам