strncpy(3) kopiuje łańcuch znaków

Other Alias

strcpy

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

Wielowątkowość (patrz pthreads(7))

Funkcje strcpy() i strncpy() są wątkowo bezpieczne.

ZGODNE Z

SVr4, 4.3BSD, C89, C99.

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:

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);

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 IMPLEMENTACJI

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.

O STRONIE

Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Jarosław Beczek (PTM) <[email protected]>, Robert Luberda <[email protected]> i Michał Kułach <[email protected]>.

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ą 3.71 oryginału.