strcpy, strcpy_s
Из ru.cppreference.net
| Определено в заголовочном файле <string.h>
|
||
char* strcpy( char* dest, const char* src );
|
(1) | (до 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_MAXdestszменьше или равно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) возвращает копию
dest2) возвращает ноль при успехе, возвращает ненулевое значение при ошибке. Также в случае ошибки записывает ноль в
dest[0] (если dest не является нулевым указателем или destsz не равно нулю и не больше RSIZE_MAX).Примечания
strcpy_s разрешено перезаписывать целевой массив от последнего записанного символа до destsz для повышения эффективности: она может копировать многобайтовыми блоками, а затем проверять наличие нулевых байтов.
Функция strcpy_s похожа на функцию BSD strlcpy, за исключением того, что
strlcpyусекает исходную строку, чтобы она поместилась в целевой (что является угрозой безопасности)strlcpyне выполняет все проверки во время выполнения, которые выполняетstrcpy_sstrlcpyне делает ошибки очевидными, устанавливая целевую строку в пустую строку или вызывая обработчик в случае неудачного вызова.
Хотя strcpy_s запрещает усечение из-за потенциальных рисков безопасности, можно усечь строку, используя для этого проверенную на границы strncpy.
Пример
Запустить этот код
#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' ; // 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
Ссылки
- Стандарт 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) |
копирует одну широкую строку в другую (функция) |
(динамическая память TR) |
выделяет копию строки (функция) |
Документация C++ для strcpy
| |