Provided by: manpages-pl-dev_4.13-4_all 

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).
┌─────────────────────┬────────────────────────┬─────────┐
│ Interfejs │ Atrybut │ Wartość │
├─────────────────────┼────────────────────────┼─────────┤
│ 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 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.
GNU 1 listopada 2020 r. STRCAT(3)