bionic (3) strncpy.3.gz

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