Namespaces
Variants

strcat, strcat_s

From cppreference.net
< c ‎ | string ‎ | byte
Определено в заголовке <string.h>
(1)
char * strcat ( char * dest, const char * src ) ;
(до 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 не является указателем на null-терминированную байтовую строку.
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_s вместо этого.

Пример

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> 
#include <stdio.h>
#include <stdlib.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

Ссылки

  • Стандарт 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

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

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