table of contents
STRCPY(3) | Podręcznik programisty Linuksa | STRCPY(3) |
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).
Interfejs | Atrybut | Wartość |
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().
One valid (and intended) use of strncpy() is to copy a C string to a fixed-length buffer while ensuring both that the buffer is not overflowed and that unused bytes in the target buffer are zeroed out (perhaps to prevent information leaks if the buffer is to be written to media or transmitted to another process via an interprocess communication technique).
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);
This function is similar to strncpy(), but it copies at most size-1 bytes to dest, always adds a terminating null byte, and does not pad the target with (further) null bytes. This function fixes some of the problems of strcpy() and strncpy(), but the caller must still handle the possibility of data loss if size is too small. The return value of the function is the length of src, which allows truncation to be easily detected: if the return value is greater than or equal to size, truncation occurred. If loss of data matters, the caller must either check the arguments before the call, or test the function return value. strlcpy() is not present in glibc and is not standardized by POSIX, but is available on Linux via the libbsd library.
BŁĘDY¶
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.16 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ą: Jarosław Beczek <bexx@poczta.onet.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.
15 września 2017 r. | GNU |