Spec-Zone.ru › C

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

См. также

strncpystrncpy_s
(C11)
копирует определенное количество символов из одной строки в другую
(функция)
memcpymemcpy_s
(C11)
копирует один буфер в другой
(функция)
wcscpywcscpy_s
(C95)(C11)
копирует одну широкую строку в другую
(функция)
strdup
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API