Namespaces
Variants

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_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.

Пример

#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

См. также

копирует определённое количество символов из одной строки в другую
(функция)
копирует один буфер в другой
(функция)
(C95)(C11)
копирует одну широкую строку в другую
(функция)
(динамическая память TR)
выделяет копию строки
(функция)