Provided by: manpages-pl-dev_0.6-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

   Wielowątkowość (patrz pthreads(7))
       Funkcje strcpy() i strncpy() są wątkowo bezpieczne.

ZGODNE Z

       SVr4, 4.3BSD, C89, C99.

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  3.71  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą  wersję  oryginału  można
       znaleźć pod adresem http://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ą    3.71
       oryginału.