STRCPY(3)

NAZWA
strcpy, strncpy - kopiuje łańcuch znaków

SKŁADNIA
#include <string.h>

char *strcpy(char *restrict dest, const char *src);
char *strncpy(char *restrict dest, const char *restrict 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().

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:

    if (buflen > 0) {
        strncpy(buf, str, buflen - 1);
        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
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 5.13 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 (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 manpages-pl-list@lists.sourceforge.net.