strcat(3) объединяет две строки

Other Alias

strncat

ОБЗОР

#include <string.h>


char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);

ОПИСАНИЕ

Функция strcat() добавляет строку src к строке dest, перезаписывая байт null ('\0') в конце dest и добавляет завершающий байт null. Строки не могут перекрываться, а в строке dest должно хватать свободного места для размещения объединённой строки. Если размер dest мал, то поведение программы непредсказуемо; переполнение буфера — любимое средство для атаки защищённых программ.

Функция strncat() работает аналогичным образом, но

*
задействует не более n первых байт строки src и
*
строка src может не завершаться байтом null, если в ней содержится n или более байт.

Как и strcat(), строка-результат в dest всегда заканчивается байтом null.

Если в src содержится n или более байт, то strncat() записывает n+1 байт в dest (n из src плюс завершающий байт null). Поэтому размер dest должен быть не менее strlen(dest)+n+1.

Простейшей реализацией strncat() может быть:

char *
strncat(char *dest, const char *src, size_t n)
{
    size_t dest_len = strlen(dest);
    size_t i;
    for (i = 0 ; i < n && src[i] != '\0' ; i++)
        dest[dest_len + i] = src[i];
    dest[dest_len + i] = '\0';
    return dest;
}

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функции strcat() и strncat() возвращают указатель на скопированную строку dest.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
strcat(), strncat() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

ЗАМЕЧАНИЯ

В некоторых системах (BSD, Solaris и других) есть следующая функция:


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

Эта функция добавляет строку src, оканчивающуюся null, к строке dest, копируя не более size-strlen(dest)-1 байт из src, и добавляет к результату конечный байт null, если size менее strlen(dest). Эта функция исправляет проблему с переполнением буфера в strcat(), но вызывающий по прежнему должен рассматривать возможность потери данных, если size слишком мал. Функция возвращает длину строки, которую strlcat() пыталась создать; если возвращаемое значение больше или равно size, то произошла потеря данных. Если потеря данных критична, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое функцией значение. Функция strlcat() отсутствует в glibc и не стандартизована POSIX, но доступна в Linux в библиотеке libbsd.