strcpy, strcpy_s
Defined in header <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), за исключением того, что может перезаписать остальную часть целевого массива неопределёнными значениями, и что следующие ошибки обнаруживаются во время выполнения и вызывают функцию обработчика ограничений, установленную в данный момент:
-
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 <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char *src = "Take the test.";
// src[0] = 'M' ; // this would be undefined behavior
char dst[strlen(src) + 1]; // +1 to accommodate for the null terminator
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
Ссылки
- Стандарт 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++ документация для strcpy |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strcpy