НАЗВА

strcpy, strncpy - копіює рядок

ВИКОРИСТАННЯ

#іnclude <string.h>

char strcpy(char dest, const char *src);

char strncpy(char dest, const char *src, size_t n);

ОПИС

Функція strcpy() копіює рядок, на який вказує src (включаючи кінцевий символ '\0'), у масив, на який вказує dest. Рядки не можуть перекриватися і рядок що утвориться, на який вказує dest, повинен мати досить місця для копії.

Функція strncpy() працює аналогічно, за винятком того копіюється не більше перших n байтів рядка src. Таким чином, якщо в n байтах рядка src немає нульового байта, то отриманий рядок не буде закінчуватися символом ' '.

Якщо довжина src менша за n, то зайве місце в dest заповниться нулями.

ПРИКЛАДИ

Наступне надасть charray значення "abc\0\0\0":

(void)strncpy(charray, "abc", 6);

Наступний приклад встановить charray як "abcdef" без нульового закінчення, оскільки копійований рядок >= параметра довжини масиву. strncpy() може надати нульове закінчення лише у випадку коли копійований рядок менший за параметр довжини.

(void)strncpy(charray, "abcdef", 6);

Нижче наведено приклад у якому ми копіюємо стільки знаків, скільки це можливо з input до buff і вручну добавляємо '\0' в кінці, оскільки немає надії що strncpy() завершить рядок належним чином.

char buf[BUFSIZE];

(void)strncpy(buf, input, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';

Зауважте, що ?strlcpy(3) буде кращим вибором для таких ситуацій. Той самий вираз з використанням strlcpy() буде виглядати просто як:

(void)strlcpy(buf, input, sizeof(buf));

ПОВЕРНЕНІ ЗНАЧЕННЯ

Функції strcpy() і strncpy() повертають покажчик на рядок dest, отриманий в результаті.

ВАДИ

Якщо в новоствореному рядку недостатньо місця для операції strcpy() (це буває, якщо недосвідчений або лінивий програміст не перевірив розміру перед копіюванням), то може статися все що завгодно. Переповнення рядків сталої довжини є улюбленою технікою крекерів.

ВІДПОВІДНІСТЬ СТАНДАРТАМ

SVID 3, POSIX, BSD 4.3, ISO 9899

ДИВІТЬСЯ ТАКОЖ

bcopy(3), ?memccpy(3), memcpy(3), memmove(3), ?wcscpy(3), ?wcsncpy(3)


Переклав українською Віталій Цибуляк vi@uatech.atspace.com