strcpy, strcpy_s
Определено в заголовочном файле <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.
Поведение не определено, если массив
2) То же, что (1), за исключением того, что функция может перезаписать оставшуюся часть массива назначения неопределёнными значениями и что следующие ошибки обнаруживаются во время выполнения и приводят к вызову установленной в данный момент функции обработчика ограничений: dest недостаточно велик. Поведение не определено, если строки перекрываются. Поведение не определено, если dest не является указателем на символьный массив или src не является указателем на строку байтов с нулевым завершением.-
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' ; // 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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/byte/strcpy