Функция strcpy в C/C++

strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль-терминированной строки (включая нуль-терминатор) в заданный буфер.


Прототип, описанный в заголовочном файле string.h:
char * strcpy ( char * destination, const char * source );
  • source - указатель на исходную C строку с завершающим нулевым символом
  • destination - указатель на массив (буфер назначения)
В версии С99 к параметрам source и destination применен квалификатор restrict.

Существует мнемоническое правило, позволяющее легко запомнить, к чему относится const. Надо провести черту через "*", если const слева, то оно относится к значению данных; если справа — к значению указателя.

Функция возвращает значение указателя destination.
Тот же самый прототип может быть записан как:
char *strcpy (char *dst, const char *src);
Вообще считается что звездочка не относится к имени параметра или функции поэтому некоторые пишут ее отдельно от имени как в первом случае.

Копирование включает в себя и копирование завершающего null-символа.
Чтобы избежать переполнения размер массива на который указывает destination должен быть достаточно величины чтобы вместить в себя строку source, включая завершающий null-символ. И массив destination не должен перекрываться в памяти с source. Если символьные массивы  source и destination перекрываются, поведение функции strcpy() не определено.


Пример 0:
char str[80];
strcpy(str, "привет");


Пример 1:
#include <stdio.h>
#include <string.h>

int main() {
 char str1[] = "Sample string";
 char str2[40];
 char str3[40];
 strcpy(str2, str1);
 strcpy(str3, "copy successful");
 printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
 return 0;
}

Вывод 1:
str1: Sample string
str2: Sample string
str3: copy successful


Пример 2:
#include <string.h>
#include <stdio.h> /* для printf() */

int main() {
 char *str = "образец строки";
 char buf[32]; // буфер размером больше строки
 memset(buf, 0, sizeof(buf)); // очистка буфера для вывода
 // Другой способ, если не требуется равенство нулю всех байтов
 // *buf = '\0';
 printf("строка: \"%s\"\n", str);
 strcpy(buf, str);
 printf("буфер после копирования: \"%s\"\n", buf);
 return 0;
}

Вывод 2:
строка: "образец строки"
буфер после копирования: "образец строки"


Пример 3:
#include <stdio.h>
#include <string.h>

int main()
{
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is tutorialspoint.com");
   strcpy(dest, src);

   printf("Final copied string : %s\n", dest);
   
   return(0);
}

Вывод 3:
Final copied string : This is tutorialspoint.com


Пример 4:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char A[] = "Take the test.";
    char *B = malloc(strlen(A) + 1);
    strcpy(B, A);
    A[0] = 'M';
    printf("A = %s\nB = %s", A, B);

    return 0;
}

Вывод 4:
A = Make the test.
B = Take the test.

Поскольку функция не проверяет длину строки и размер буфера, она не должна использоваться для работы с данными, размер которых неизвестен, во избежание переполнения буфера destination.

Вместо strcpy рекомендуется использовать стандартную функцию strncpy (добавляя нуль-терминатор при необходимости!) или не входящие в стандарт функции strlcpy или strncpy_s.


Дополнительная информация:


--