strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль-терминированной строки (включая нуль-терминатор) в заданный буфер.
Прототип, описанный в заголовочном файле string.h:
char * strcpy ( char * destination, const char * source );
Пример 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;
}
Пример 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.
Дополнительная информация:
Прототип, описанный в заголовочном файле 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);
Существует мнемоническое правило, позволяющее легко запомнить, к чему относится const. Надо провести черту через "*", если const слева, то оно относится к значению данных; если справа — к значению указателя.
Тот же самый прототип может быть записан как:
char *strcpy (char *dst, const char *src);
Вообще считается что звездочка не относится к имени параметра или функции поэтому некоторые пишут ее отдельно от имени как в первом случае.
Копирование включает в себя и копирование завершающего null-символа.
Чтобы избежать переполнения размер массива на который указывает destination должен быть достаточно величины чтобы вместить в себя строку source, включая завершающий null-символ. И массив destination не должен перекрываться в памяти с source. Если символьные массивы source и destination перекрываются, поведение функции strcpy() не определено.
Пример 0:
char str[80];
strcpy(str, "привет");
Пример 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);
}
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.
Вместо strcpy рекомендуется использовать стандартную функцию strncpy (добавляя нуль-терминатор при необходимости!) или не входящие в стандарт функции strlcpy или strncpy_s.
Дополнительная информация:
- Об инициализации строк: http://stackoverflow.com/a/472847/2289640
- Для хранения null-terminated строки надо явно указывать malloc() выделять дополнительный байт для хранения null-terminator. Если длина строки будет храниться в другом месте то null terminator в принципе не нужен и не обязательно выделять под него байт. Строковая библиотека C работает только с null-terminated строками.
- Заметьте, что для каждой строки s strlen(s)==sizeof(s)-1, поскольку strlen() не учитывает завершающий 0.
- strcpy - C++ Reference
- Howto Compiling C program and creating executable file under Linux / UNIX / *BSD
- strcpy — Википедия
- strcpy - cppreference.com
- c - Is null character included while allocating using malloc - Stack Overflow
- strcpy() - C Library Function Example
- std::strcpy - cppreference.com
- strcpy
- strcpy, wcscpy, _mbscpy