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) возвращает копию
dest2) возвращает ноль в случае успеха, возвращает ненулевое значение в случае ошибки. Кроме того, при ошибке записывает ноль в
dest[0] (если только dest не является нулевым указателем или destsz не равно нулю или больше RSIZE_MAX).Примечания
Поскольку strcat требуется находить конец dest при каждом вызове, конкатенация многих строк в одну с помощью strcat неэффективна.
strcat_s разрешается затирать целевой массив от последнего записанного символа до destsz для повышения эффективности: она может копировать многобайтовыми блоками, а затем проверять наличие нулевых байтов.
Функция strcat_s похожа на функцию BSD strlcat, за исключением того, что
strlcatусекает исходную строку, чтобы она поместилась в целевуюstrlcatне выполняет все проверки времени выполнения, которые выполняетstrcat_sstrlcatне делает ошибки очевидными, устанавливая целевую строку в пустую строку или вызывая обработчик в случае неудачи.
Хотя 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
Смотрите также
(C11) |
конкатенирует определённое количество символов двух строк (функция) |
(C11) |
копирует одну строку в другую (функция) |
(C23) |
копирует один буфер в другой, останавливаясь после указанного разделителя (функция) |
Документация C++ для strcat
| |