jammy (3) strcat.3.gz

Provided by: manpages-pl-dev_4.13-4_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ŁADY

       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 <stdint.h>
       #include <string.h>
       #include <time.h>
       #include <stdio.h>

       int
       main(int argc, char *argv[])
       {
       #define LIM 4000000
           char p[LIM + 1];    /* +1 for terminating null byte */
           time_t base;

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

           for (int j = 0; j < LIM; j++) {
               if ((j % 10000) == 0)
                   printf("%d %jd\n", j, (intmax_t) (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 5.10 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ą:   Andrzej   Krzysztofowicz
       <ankry@green.mf.pg.gda.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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej  ⟨manpages-pl-
       list@lists.sourceforge.net⟩.