Namespaces
Variants

strcat, strcat_s

Со ru.cppreference.net
 
 
 
Нуль-терминированные байтовые строки
Функции
Манипуляции с символами
Преобразования в числовые форматы и из них
Манипуляции со строками
Исследование строк
Манипуляции с памятью
Разное
 
Определена в заголовке <string.h>
char* strcat( char* dest, const char* src );
(1) (до C99)
char* strcat( char* restrict dest, const char* restrict src );
(начиная с C99)
errno_t strcat_s(char* restrict dest, rsize_t destsz, const char* restrict src);
(2) (начиная с C11)
1) Добавляет копию нуль-терминированной байтовой строки, на которую указывает src, в конец нуль-терминированной байтовой строки, на которую указывает dest. Символ src[0] заменяет нулевой терминатор в конце dest. Результирующая байтовая строка завершается нулём.
Поведение не определено, если целевой массив недостаточно велик для содержимого как src, так и dest и завершающего нулевого символа. Поведение не определено, если строки перекрываются. Поведение не определено, если либо dest, либо src не является указателем на нуль-терминированную байтовую строку.
2) То же, что и (1), за исключением того, что она может затирать остаток целевого массива (от последнего записанного символа до destsz) неопределёнными значениями, и что следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений:
  • src или dest является нулевым указателем
  • destsz равно нулю или больше, чем RSIZE_MAX
  • в первых destsz байтах dest
  • нет нулевого терминатораdestпроизошло бы усечение (доступное место в конце src не вместило бы все символы, включая нулевой терминатор, из
  • )
произошло бы перекрытие исходной и целевой строкdest < strlen(dest)+strlen(src)+1 < Поведение не определено, если размер массива символов, на который указывает destsz= destsz; другими словами, ошибочное значение
не раскрывает предстоящее переполнение буфера.strcat_s Как и все функции с проверкой границ, __STDC_LIB_EXT1__ гарантированно доступна только если __STDC_WANT_LIB_EXT1__ определена реализацией и если пользователь определяет 1 как целочисленную константу < до включения >string.h

Параметры

dest - указатель на нуль-терминированную байтовую строку, к которой нужно добавить
src - указатель на нуль-терминированную байтовую строку, которую нужно скопировать
destsz - максимальное количество символов для записи, обычно размер целевого буфера

Возвращаемое значение

1) возвращает копию dest
2) возвращает ноль в случае успеха, возвращает ненулевое значение в случае ошибки. Кроме того, при ошибке записывает ноль в dest[0] (если только dest не является нулевым указателем или destsz не равно нулю или больше RSIZE_MAX).

Примечания

Поскольку strcat требуется находить конец dest при каждом вызове, конкатенация многих строк в одну с помощью strcat неэффективна.

strcat_s разрешается затирать целевой массив от последнего записанного символа до destsz для повышения эффективности: она может копировать многобайтовыми блоками, а затем проверять наличие нулевых байтов.

Функция strcat_s похожа на функцию BSD strlcat, за исключением того, что

  • strlcat усекает исходную строку, чтобы она поместилась в целевую
  • strlcat не выполняет все проверки времени выполнения, которые выполняет strcat_s
  • strlcat не делает ошибки очевидными, устанавливая целевую строку в пустую строку или вызывая обработчик в случае неудачи.

Хотя strcat_s запрещает усечение из-за потенциальных рисков безопасности, можно усечь строку, используя strncat с проверкой границ.

Пример

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strcat(str, " ...");
    strcat(str, " Goodbye World!");
    puts(str);

#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcat_s(str, sizeof str, " ... ");
    printf("str = \"%s\", r = %d\n", str, r);
    r = strcat_s(str, sizeof str, " and this is too much");
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

Возможный вывод:

Hello World! ... Goodbye World!
str = "Hello World! ... Goodbye World! ... ", r = 0
str = "", r = 22

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.24.3.1 Функция strcat (стр.: TBD)
  • K.3.7.2.1 Функция strcat_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.24.3.1 Функция strcat (стр.: TBD)
  • K.3.7.2.1 Функция strcat_s (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.24.3.1 Функция strcat (стр.: 364)
  • K.3.7.2.1 Функция strcat_s (стр.: 617-618)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.21.3.1 Функция strcat (стр.: 327)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.11.3.1 Функция strcat

Смотрите также

конкатенирует определённое количество символов двух строк
(функция)
копирует одну строку в другую
(функция)
копирует один буфер в другой, останавливаясь после указанного разделителя
(функция)