Provided by: manpages-pl-dev_0.7-2_all bug

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).

       ┌────────────────────┬────────────────────────┬─────────┐
       │InterfejsAtrybutWartość │
       ├────────────────────┼────────────────────────┼─────────┤
       │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:

           strncpy(buf, str, buflen - 1);
           if (buflen > 0)
               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 IMPLEMENTACJI

       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  4.07  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 man są: Jarosław Beczek (PTM)
       <bexx@poczta.onet.pl>,    Robert    Luberda    <robert@debian.org>    i    Michał   Kułach
       <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   4.07
       oryginału.