- Strlcpy
-
strlcpy
Strlcpy — нестандартная функция, для замены функции стандартной библиотеки языка программирования Си strncpy, для копирования содержимого нуль-терминированной строки в буфер ограниченного размера.strlcpy— безопасная и производительная замена стандартной функцииstrncpy, функция-аналогstrcpyс защитой от переполнения буфера.Функция появилась и поддерживается в OpenBSD и некоторых других операционных системах. В системах не поддерживающих
strlcpyвозможна ее кустарная реализация, например из исходного кода, распространяемого по лицензии BSD.Содержание
Функция
Прототип, описанный в заголовочном файле
string.h:size_t strlcpy (char *dst, const char *src, size_t size);dst— указатель на буфер назначения.src— указатель на исходную строку.size— размер буфера назначения.
Функция копирует из строки
srcв буферdstне более чемsize - 1символов и гарантированно устанавливает в конец строки нулевой символ.Возвращаемое значение
Функция возвращает размер строки по адресу
src, вне зависимости удалось ее скопировать полностью или нет. Это позволяет легко определить что буфер назначения слишком мал для копируемой строки.Пример использования
#include <string.h> #include <stdio.h> /* для printf() */ char buf[10]; // буфер размером меньше строки int main() { char *str = "образец строки"; size_t sz; buf[0] = '\0'; // избыточная инициализация для отладочной печати printf("строка: \"%s\"\n\n", str); printf("буфер перед копированием: \"%s\"\n", buf); sz = strlcpy(buf, str, sizeof(buf)); if (sz >= sizeof(buf)) // пример определения усечения строки printf("обнаружено усечение строки с %d до %d символов !\n", sz, sizeof(buf)-1); printf("буфер после копирования: \"%s\"\n", buf); return 0; }
Вывод:
строка: "образец строки" буфер перед копированием: "" обнаружено усечение строки с 14 до 9 символов ! буфер после копирования: "образец с"
(строка при копировании была усечена до размера буфера - 9 символов + нулевой)
Внешние ссылки
- strlcpy(1) (англ.) — Руководство по функции
strlcpyна сайте OpenBSD - strlcpy.c (англ.) — Исходный код функции
strlcpyв CVS-репозитории OpenBSD.
Wikimedia Foundation. 2010.