strcpy, strcpy_s
From cppreference.net
|
Определено в заголовке
<string.h>
|
||
| (1) | ||
|
char
*
strcpy
(
char
*
dest,
const
char
*
src
)
;
|
(до C99) | |
|
char
*
strcpy
(
char
*
restrict
dest,
const
char
*
restrict
src
)
;
|
(начиная с C99) | |
|
errno_t strcpy_s
(
char
*
restrict
dest, rsize_t destsz,
const
char
*
restrict
src
)
;
|
(2) | (начиная с C11) |
1)
Копирует нуль-терминированную байтовую строку, на которую указывает
src
, включая нулевой терминатор, в массив символов, на первый элемент которого указывает
dest
.
Поведение не определено, если
dest
массив недостаточно велик. Поведение не определено, если строки перекрываются. Поведение не определено, если либо
dest
не является указателем на массив символов, либо
src
не является указателем на байтовую строку с нулевым завершителем.
2)
То же, что и
(1)
, за исключением того, что она может заполнить остаток массива назначения неопределёнными значениями и что следующие ошибки обнаруживаются во время выполнения и вызывают установленную в данный момент
constraint handler
функцию:
-
- src или dest является нулевым указателем
- destsz равен нулю или больше RSIZE_MAX
- destsz меньше или равен strnlen_s ( src, destsz ) ; другими словами, произошло бы усечение
- возникло бы перекрытие между исходной и целевой строками
Поведение не определено, если размер массива символов, на который указывает
dest
<=
strnlen_s
(
src, destsz
)
<
destsz
; другими словами, ошибочное значение
destsz
может допустить переполнение буфера.
-
Как и все функции с проверкой границ,
strcpy_sгарантированно доступна только если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <string.h> .
Содержание |
Параметры
| dest | - | указатель на массив символов для записи |
| src | - | указатель на копируемую байтовую строку с нулевым завершителем |
| destsz | - | максимальное количество символов для записи, обычно размер буфера назначения |
Возвращаемое значение
1)
возвращает копию
dest
2)
возвращает ноль при успехе, возвращает ненулевое значение при ошибке. Также при ошибке записывает ноль в
dest
[
0
]
(если только
dest
не является нулевым указателем или
destsz
не равен нулю или не превышает
RSIZE_MAX
).
Примечания
strcpy_s
разрешено перезаписывать целевой массив от последнего записанного символа до
destsz
для повышения эффективности: он может копировать многобайтовыми блоками и затем проверять нулевые байты.
Функция
strcpy_s
аналогична функции BSD
strlcpy
, за исключением того, что
-
strlcpyобрезает исходную строку для размещения в буфере назначения (что представляет угрозу безопасности) -
strlcpyне выполняет всех проверок во время выполнения, которые делаетstrcpy_s -
strlcpyне делает ошибки явными через установку буфера назначения в нулевую строку или вызов обработчика при сбое операции.
Хотя
strcpy_s
запрещает усечение из-за потенциальных рисков безопасности, возможно усечь строку с использованием проверяющего границы
strncpy_s
вместо этого.
Пример
Запустить этот код
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { const char* src = "Take the test."; // src[0] = 'M' ; // это было бы неопределенным поведением char dst[strlen(src) + 1]; // +1 для учета нулевого терминатора strcpy(dst, src); dst[0] = 'M'; // OK printf("src = %s\ndst = %s\n", src, dst); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); int r = strcpy_s(dst, sizeof dst, src); printf("dst = \"%s\", r = %d\n", dst, r); r = strcpy_s(dst, sizeof dst, "Take even more tests."); printf("dst = \"%s\", r = %d\n", dst, r); #endif }
Возможный вывод:
src = Take the test. dst = Make the test. dst = "Take the test.", r = 0 dst = "", r = 22
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.24.2.3 Функция strcpy (стр.: TBD)
-
- K.3.7.1.3 Функция strcpy_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.24.2.3 Функция strcpy (стр: 264-265)
-
- K.3.7.1.3 Функция strcpy_s (стр: 447)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.24.2.3 Функция strcpy (стр: 363)
-
- K.3.7.1.3 Функция strcpy_s (стр: 615-616)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.21.2.3 Функция strcpy (стр: 326)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.11.2.3 Функция strcpy
Смотрите также
|
(C11)
|
копирует определенное количество символов из одной строки в другую
(функция) |
|
(C11)
|
копирует один буфер в другой
(функция) |
|
(C95)
(C11)
|
копирует одну широкую строку в другую
(функция) |
|
(dynamic memory TR)
|
выделяет копию строки
(функция) |
|
C++ documentation
для
strcpy
|
|