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
См. также
|
(C11) | конкатенирует определённое количество символов двух строк (функция) |
|
(C11) | копирует одну строку в другую (функция) |
|
(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