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) |
src
, в конец нуль-терминированной байтовой строки, на которую указывает
dest
. Символ
src[0]
заменяет нуль-терминатор в конце
dest
. Результирующая байтовая строка является нуль-терминированной.
src
, так и
dest
и завершающего нулевого символа. Поведение не определено, если строки перекрываются. Поведение не определено, если либо
dest
, либо
src
не является указателем на null-терминированную байтовую строку.
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 | - | максимальное количество символов для записи, обычно размер буфера назначения |
Возвращаемое значение
dest
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
|
|