Provided by: manpages-pl-dev_4.13-4_all 

NAZWA
strcpy, strncpy - kopiuje łańcuch znaków
SKŁADNIA
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
OPIS
Funkcja strcpy() kopiuje łańcuch znaków wskazywany przez src, łącznie z kończącym znakiem null ('\0'), do
tablicy wskazywanej przez dest. Łańcuchy nie mogą na siebie nachodzić. Łańcuch docelowy dest musi być
wystarczająco długi, żeby pomieścić kopie src. Prosimy uważać na przepełnienia bufora! (Patrz BŁĘDY
IMPLEMENTACJI).
Funkcja strncpy() jest podobna, z tym że kopiuje nie więcej niż n bajtów z src. Ostrzeżenie: Jeżeli nie
było znaku null wśród pierwszych n bajtów src, to łańcuch dest nie będzie zakończony znakiem null.
Jeśli długość src jest mniejsza niże n, to strncpy() zapisze dodatkowe znaki null do dest, aby zapewnić,
że n bajtów zostało zapisane.
Prosta implementacja strncpy() mogłaby wyglądać tak:
char *
strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';
return dest;
}
WARTOŚĆ ZWRACANA
Funkcje strcpy() i strncpy() zwracają wskaźnik do łańcucha docelowego dest.
ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
┌─────────────────────┬────────────────────────┬─────────┐
│ Interfejs │ Atrybut │ Wartość │
├─────────────────────┼────────────────────────┼─────────┤
│ strcpy(), strncpy() │ Bezpieczeństwo wątkowe │ MT-Safe │
└─────────────────────┴────────────────────────┴─────────┘
ZGODNE Z
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
UWAGI
Niektórzy programiści uważają strncpy() za nieefektywną i podatną na błędy. Jeśli programista wie (tj. ma
kod, który to testuje!), że rozmiar dest jest większy od rozmiaru src, to może użyć strcpy().
Jednym poprawnym (i zamierzonym) użyciem strncpy() jest kopiowanie łańcucha znaków języka C do bufora o
ustalonej długości, zapewniając przy tym, że zarówno bufor nie jest nadpisywany, jak i że nieużywane
bajty bufora docelowego są zerowane (być może po to, by zapobiec wyciekom danych, jeśli bufor docelowy
zostanie gdzieś zapisany lub przesłany do innego procesu za pomocą technik komunikacji międzyprocesowej).
Jeśli nie ma kończącego bajtu null w pierwszych n bajtach w src, to strncpy() utworzy niezakończony
łańcuch w dest. Jeśli buf ma długość buflen, można wymusić jego zakończenie w sposób podobny do opisanego
poniżej:
if (buflen > 0) {
strncpy(buf, str, buflen - 1);
buf[buflen - 1]= '\0';
}
(Oczywiście powyższa technika ignoruje fakt, że jeśli src zawiera więcej niż buflen - 1 bajtów,
informacja jest tracona podczas kopiowania ich do dest).
strlcpy()
Niektóre systemy (BSD, Solaris i inne) zawierają następującą funkcję:
size_t strlcpy(char *dest, const char *src, size_t size);
Funkcja jest podobna do strncpy(), ale kopiuje co najwyżej size-1 bajtów do dest, zawsze dodaje kończący
bajt null, i nie dopisuje dodatkowych bajtów null. Funkcja rozwiązuje kilka problemów obecnych w strcpy()
i strncpy(), jednakże program wywołujący wciąż musi obsłużyć możliwość utraty danych, jeśli size jest za
małe. Funkcja zwraca długość łańcucha src, co pozwala na proste wykrycie obcięcia łańcucha: jeśli wartość
zwrócona jest większa lub równa size, to łańcuch został obcięty. Jeśli utrata danych ma znaczenie, to
program wywołujący musi albo sprawdzać argumenty przed wywołaniem, albo sprawdzać wartość zwracaną.
strlcpy() nie jest obecna w glibc i nie jest opisana w standardzie POSIX, jednak jest dostępna w Linuksie
w bibliotece libbsd.
BŁĘDY
Jeśli docelowy łańcuch znaków przekazany do strcpy() nie jest wystarczająco duży, to wszystko może się
stać. Nadpisywanie buforów o stałej długości jest ulubioną techniką crackerów przejmowania kontroli nad
komputerem. Program, kiedykolwiek tylko czyta dane z buforu lub je do niego kopiuje, najpierw musi
sprawdzić, czy jest wystarczająca ilość dostępnego miejsca. Może to być niepotrzebne, jeśli można
wykazać, że nadpisanie bufora jest niemożliwe. Należy jednak być ostrożnym: programy zmieniają się w
czasie, i to w taki sposób, że niemożliwe może stać się możliwe.
ZOBACZ TAKŻE
bcopy(3), memccpy(3), memcpy(3), memmove(3), stpcpy(3), stpncpy(3), strdup(3), string(3), wcscpy(3),
wcsncpy(3)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux man-pages. Opis projektu, informacje
dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem
https://www.kernel.org/doc/man-pages/.
T◈UMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Jarosław Beczek <bexx@poczta.onet.pl>,
Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ
ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-
list@lists.sourceforge.net.
GNU 6 marca 2019 r. STRCPY(3)