strcpy

STRCPY(3)                Podręcznik programisty Linuksa                STRCPY(3)



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.08 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
       <manpages-pl-list@lists.sourceforge.net>.



GNU                              6 marca 2019 r.                       STRCPY(3)