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

NAZWA

       strcat, strncat - połączenie dwóch łańcuchów

SKŁADNIA

       #include <string.h>

       char *strcat(char *dest, const char *src);

       char *strncat(char *dest, const char *src, size_t n);

OPIS

       Funkcja  strcat()  dołącza  łańcuch  src  do  łańcucha  dest,  nadpisując znak null ('\0')
       kończący dest i dodając znak null na końcu wyniku. Łańcuchy nie mogą na siebie nachodzić a
       łańcuch  dest  musi  zawierać  dostateczną  ilość miejsca na wynik. Jeśli dest nie zawiera
       wystarczającej  ilości  miejsca,  to  zachowanie  programu  jest  nieprzewidywalne,   gdyż
       występuje  przepełnienie  bufora,  które  jest  najbardziej popularnym sposobem atakowania
       bezpiecznych programów.

       Funkcja strncat() jest podobna, z wyjątkiem tego, że

       *  użyje co najwyżej n bajtów z src oraz

       *  src nie musi być zakończony znakiem null, jeśli zawiera n lub więcej bajtów.

       Tak jak w przypadku strcat() wynikowy łańcuch w dest jest zawsze zakończony znakiem null.

       Jeśli src zawiera n lub więcej bajtów, to strncat() zapisze n+1  w  dest  (n  z  src  plus
       kończący bajt null). Dlatego też rozmiar dest musi wynosić co najmniej strlen(dest)+n+1.

       Prosta implementacja strncat() mogłaby wyglądać tak:

           char *
           strncat(char *dest, const char *src, size_t n)
           {
               size_t dest_len = strlen(dest);
               size_t i;

               for (i = 0 ; i < n && src[i] != '\0' ; i++)
                   dest[dest_len + i] = src[i];
               dest[dest_len + i] = '\0';

               return dest;
           }

WARTOŚĆ ZWRACANA

       Funkcje strcat() i strncat() zwracają wskaźnik do wynikowego łańcucha dest.

ATRYBUTY

       Informacje   o   pojęciach   używanych   w  tym  rozdziale  można  znaleźć  w  podręczniku
       attributes(7).

       ┌────────────────────┬────────────────────────┬─────────┐
       │InterfejsAtrybutWartość │
       ├────────────────────┼────────────────────────┼─────────┤
       │strcat(), strncat() │ Bezpieczeństwo wątkowe │ MT-Safe │
       └────────────────────┴────────────────────────┴─────────┘

ZGODNE Z

       POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

UWAGI

       Niektóre systemy (BSD, Solaris i inne) zawierają następującą funkcję:

           size_t strlcat(char *dest, const char *src, size_t size);

       Funkcja dołączą zakończony znakiem null łańcuch src do łańcucha dest, kopiując  z  src  co
       najwyżej  size-strlen(dest)-1  znaków  i  dodając  kończący  znak null, chyba że size jest
       mniejsze od strlen(dest). Funkcja rozwiązuje problem przepełnienia  bufora  występujący  w
       strcat(),  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, który  strlcat()  próbowało  utworzyć;
       jeśli  wartość  zwrócona  jest  większa  lub równa size, to część danych została utracona.
       Jeśli utrata danych ma znaczenie, to program  wywołujący  musi  albo  sprawdzać  argumenty
       przed wywołaniem, albo sprawdzać wartość zwracaną. strlcat() nie jest obecna w glibc i nie
       jest opisana w standardzie POSIX, jednak jest dostępna w Linuksie w bibliotece libbsd.

PRZYKŁAD

       Ponieważ  strcat()  i  strncat()  muszą  odnaleźć  bajt  null  kończący  łańcuch  dest  za
       pomocą wyszukiwania rozpoczynającego się od początku łańcucha, czas wykonania tych funkcji
       skaluje się zgodnie z długością łańcucha dest. Można to pokazać wykonując poniższy program
       (jeśli  celem  jest  połączenie  wielu  łańcuchów,  to ręczne skopiowanie bajtów z każdego
       łańcucha  źródłowego  przy  zachowaniu  wskaźnika  na  koniec   łańcucha   docelowego   da
       lepszą wydajność).

   Kod źródłowy programu

       #include <string.h>
       #include <time.h>
       #include <stdio.h>

       int
       main(int argc, char *argv[])
       {
       #define LIM 4000000
           int j;
           char p[LIM];
           time_t base;

           base = time(NULL);
           p[0] = '\0';

           for (j = 0; j < LIM; j++) {
               if ((j % 10000) == 0)
                   printf("%d %ld\n", j, (long) (time(NULL) - base));
               strcat(p, "a");
           }
       }

ZOBACZ TAKŻE

       bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(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ą:  Andrzej
       Krzysztofowicz (PTM) <ankry@mif.pg.gda.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.