strlcpy

Из Википедии, бесплатной энциклопедии

strlcpy и strlcat — нестандартные функции, созданные в качестве замены часто используемых некорректным образом аналогов стандартной библиотеки языка программирования Си для копирования содержимого нуль-терминированной строки в буфер ограниченного размера с защитой от переполнения буфера.

strlcpy и strlcat — безопасная и производительная замена стандартных функций strncpy и strncat, соответственно.

strlcpy и strlcat появились и поддерживаются в OpenBSD. Позднее их начали использовать и в некоторых других операционных системах. В системах, не поддерживающих strlcpy/strlcat, возможна их кустарная реализация, например, из исходного кода, распространяемого по лицензии BSD.

Описание[править | править код]

Прототипы, описанные в заголовочном файле 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 — указатель на буфер назначения.
  • src — указатель на исходную строку.
  • size — размер буфера назначения.

Функция strlcpy копирует из строки src в буфер dst не более чем size - 1 символов и гарантированно устанавливает в конец строки нулевой символ. strlcat делает то же самое, однако копирование ведётся не в начало dst, а таким образом, чтобы продолжить строку, на которую указывает dst. В случае, когда dst указывает на нуль-символ, поведение функций эквивалентно.

Возвращаемое значение[править | править код]

strlcpy возвращает размер строки по адресу src. strlcat возвращает суммарную длину строк по адресам src и dst. Возвращаемое значение не зависит от того, удалось скопировать строку полностью или нет; это позволяет легко определить что буфер назначения слишком мал для копируемой строки.

Пример использования[править | править код]

#include <string.h> #include <stdio.h>                       /* для printf() */  char  buf[10];                      // буфер размером меньше строки  int main(void) {    const char *str = "образец строки";    size_t sz;     buf[9] = '\0';                   // избыточная инициализация для отладочной печати     printf("строка: \"%s\"\n\n", str);    printf("буфер перед копированием: \"%s\"\n", buf);     sz = strlcpy(buf, str, sizeof(buf));        if (sz >= sizeof(buf))             printf("обнаружено усечение строки с %zu до %lu символов !\n", sz, sizeof(buf)-1);     printf("буфер после копирования:  \"%s\"\n", buf);     return 0; } 

Вывод:

строка: "образец строки"  буфер перед копированием: "" обнаружено усечение строки с 14 до 9 символов ! буфер после копирования:  "образец с" 

(строка при копировании была усечена до размера буфера — 9 символов + нулевой)

Ссылки[править | править код]