Namespaces
Variants

strcpy, strcpy_s

From cppreference.net
< c ‎ | string ‎ | byte
Определено в заголовке <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

Смотрите также

копирует определенное количество символов из одной строки в другую
(функция)
копирует один буфер в другой
(функция)
(C95) (C11)
копирует одну широкую строку в другую
(функция)
(dynamic memory TR)
выделяет копию строки
(функция)
C++ documentation для strcpy