Spec-Zone.ru › C

strcat, strcat_s

Определено в заголовке <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 не являются указателями на завершающуюся нулём байтовую строку.
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

См. также

strncatstrncat_s
(C11)
конкатенирует определённое количество символов двух строк
(функция)
strcpystrcpy_s
(C11)
копирует одну строку в другую
(функция)
memccpy
(C23)
копирует один буфер в другой, останавливаясь после указанного разделителя
(функция)
Документация C++ для strcat

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strcat

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API