STRCAT(3)

ИМЯ
strcat, 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.

ПРИМЕР
Так как strcat() и strncat() должны найти байт null, завершающий строку dest, начиная поиск от начала строки, время выполнения этих функций пропорционально длине строки dest. Это можно увидеть из запуска программы, представленной ниже (если целью является склейка несколько строк в одну, то ручное копирование байт из одного источника и управление концом строки назначения будет более производительным).

  Исходный код программы
    #include <string.h>
    #include <time.h>
    #include <stdio.h>
    int
    main(int argc, char *argv[])
    {
    #define LIM 4000000
        int j;
        char p[LIM + 1];    /* +1 для конечного байта null */
        time_t base;
        base = time(NULL);
        p[0] = '\0';
        for (j = 0; j < LIM; j++) {
            if ((j % 10000) == 0)
                printf("%d %ld\n", j, (long) (time(NULL) - base));
            strcat(p, "a");
        }
    }

СМОТРИТЕ ТАКЖЕ
bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(3)