strlcpy
Материал из Seo Wiki - Поисковая Оптимизация и Программирование
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.en:Strlcpy