strcpy








     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 і вручну добавляємо рядок належним чином.

      char buf[BUFSIZE];

      (void)strncpy(buf, input, sizeof(buf) − 1);
      buf[sizeof(buf) − 1] = ’\0’;

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

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











                                       ‐2‐




     Функції 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>