strncpy
, , _strncpy_l
, wcsncpy
, _wcsncpy_l
, , _mbsncpy
_mbsncpy_l
Skopiuj znaki jednego ciągu do innego. Dostępne są bezpieczniejsze wersje tych funkcji; zobacz , , _strncpy_s_l
, wcsncpy_s
, _wcsncpy_s_l
, _mbsncpy_s
, _mbsncpy_s_l
.strncpy_s
Ważne
_mbsncpy
nie można jej _mbsncpy_l
używać w aplikacjach wykonywanych w środowisko wykonawcze systemu Windows. Aby uzyskać więcej informacji, zobacz Funkcje CRT nieobsługiwane w aplikacjach platforma uniwersalna systemu Windows.
Składnia
char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
char *_strncpy_l(
char *strDest,
const char *strSource,
size_t count,
_locale_t locale
);
wchar_t *wcsncpy(
wchar_t *strDest,
const wchar_t *strSource,
size_t count
);
wchar_t *_wcsncpy_l(
wchar_t *strDest,
const wchar_t *strSource,
size_t count,
_locale_t locale
);
unsigned char *_mbsncpy(
unsigned char *strDest,
const unsigned char *strSource,
size_t count
);
unsigned char *_mbsncpy_l(
unsigned char *strDest,
const unsigned char *strSource,
size_t count,
_locale_t locale
);
template <size_t size>
char *strncpy(
char (&strDest)[size],
const char *strSource,
size_t count
); // C++ only
template <size_t size>
char *_strncpy_l(
char (&strDest)[size],
const char *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
wchar_t *wcsncpy(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count
); // C++ only
template <size_t size>
wchar_t *_wcsncpy_l(
wchar_t (&strDest)[size],
const wchar_t *strSource,
size_t count,
_locale_t locale
); // C++ only
template <size_t size>
unsigned char *_mbsncpy(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count
); // C++ only
template <size_t size>
unsigned char *_mbsncpy_l(
unsigned char (&strDest)[size],
const unsigned char *strSource,
size_t count,
_locale_t locale
); // C++ only
Parametry
strDest
Ciąg docelowy.
strSource
Ciąg źródłowy.
count
Liczba znaków do skopiowania.
locale
Ustawienia regionalne do użycia.
Wartość zwracana
Zwraca wartość strDest
. Żadna wartość zwracana nie jest zarezerwowana, aby wskazać błąd.
Uwagi
Funkcja strncpy
kopiuje początkowe count
znaki strSource
do strDest
i zwraca wartość strDest
. Jeśli count
wartość jest mniejsza lub równa długości strSource
, znak null nie jest dołączany automatycznie do skopiowanego ciągu. Jeśli count
jest większa niż długość strSource
ciągu docelowego, ciąg docelowy jest dopełniany znakami null o długości do długości count
. Zachowanie elementu strncpy
jest niezdefiniowane, jeśli ciągi źródłowe i docelowe nakładają się na siebie.
Ważne
strncpy
nie sprawdza wystarczającej ilości miejsca w systemie strDest
; powoduje to, że jest to potencjalna przyczyna przepełnień buforu. Argument count
ogranicza liczbę skopiowanych znaków; nie jest to limit rozmiaru strDest
elementu . Zobacz poniższy przykład. Aby uzyskać więcej informacji, zobacz Unikanie przekroków buforu.
Jeśli strDest
wskaźnik lub strSource
jest wskaźnikiem NULL
lub count
jest mniejszy lub równy zero, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonanie może kontynuować, te funkcje zwracają wartość -1 i ustawiają wartość errno
EINVAL
.
wcsncpy
i _mbsncpy
są wersjami znaków wielobajtowych i wielobajtowych .strncpy
Argumenty i zwracana wartość wcsncpy
i _mbsncpy
różnią się odpowiednio. Te sześć funkcji zachowuje się identycznie inaczej.
Wersje tych funkcji z sufiksem _l
są identyczne, z tą różnicą, że używają ustawień regionalnych przekazanych zamiast bieżących ustawień regionalnych dla zachowania zależnego od ustawień regionalnych. Aby uzyskać więcej informacji, zobacz Ustawienia regionalne.
W języku C++te funkcje mają przeciążenia szablonu, które wywołują nowsze, bezpieczne odpowiedniki tych funkcji. Aby uzyskać więcej informacji, zobacz Bezpieczne przeciążenia szablonów.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Mapowania procedur tekstu ogólnego
TCHAR.H rutyna |
_UNICODE i _MBCS niezdefiniowane |
_MBCS zdefiniowany |
_UNICODE zdefiniowany |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Uwaga
_strncpy_l
i _wcsncpy_l
nie mają zależności od ustawień regionalnych; są one udostępniane tylko dla _tcsncpy_l
i nie mają być wywoływane bezpośrednio.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> lub <wchar.h> |
_mbsncpy , _mbsncpy_l |
<mbstring.h> |
Aby uzyskać więcej informacji o zgodności platformy, zobacz Zgodność.
Przykład
W poniższym przykładzie pokazano użycie i sposób jego nieprawidłowego strncpy
użycia, aby powodować błędy programu i problemy z zabezpieczeniami. Kompilator generuje ostrzeżenie dla każdego wywołania podobnego do strncpy
crt_strncpy_x86.c(15)
: ostrzeżenie C4996: "strncpy
": Ta funkcja lub zmienna może być niebezpieczna. Rozważ użycie strncpy_s
zamiast tego. Aby wyłączyć wycofanie, użyj polecenia _CRT_SECURE_NO_WARNINGS
. Aby uzyskać szczegółowe informacje, zobacz pomoc online.
// crt_strncpy_x86.c
// Use this command in an x86 developer command prompt to compile:
// cl /TC /W3 crt_strncpy_x86.c
#include <stdio.h>
#include <string.h>
int main() {
char t[20];
char s[20];
char *p = 0, *q = 0;
strcpy_s(s, sizeof(s), "AA BB CC");
// Note: strncpy is deprecated; consider using strncpy_s instead
strncpy(s, "aa", 2); // "aa BB CC" C4996
strncpy(s + 3, "bb", 2); // "aa bb CC" C4996
strncpy(s, "ZZ", 3); // "ZZ", C4996
// count greater than strSource, null added
printf("%s\n", s);
strcpy_s(s, sizeof(s), "AA BB CC");
p = strstr(s, "BB");
q = strstr(s, "CC");
strncpy(s, "aa", p - s - 1); // "aa BB CC" C4996
strncpy(p, "bb", q - p - 1); // "aa bb CC" C4996
strncpy(q, "cc", q - s); // "aa bb cc" C4996
strncpy(q, "dd", strlen(q)); // "aa bb dd" C4996
printf("%s\n", s);
// some problems with strncpy
strcpy_s(s, sizeof(s), "test");
strncpy(t, "this is a very long string", 20 ); // C4996
// Danger: at this point, t has no terminating null,
// so the printf continues until it runs into one.
// In this case, it will print "this is a very long test"
printf("%s\n", t);
strcpy_s(t, sizeof(t), "dogs like cats");
printf("%s\n", t);
strncpy(t + 10, "to chase cars.", 14); // C4996
printf("%s\n", t);
// strncpy has caused a buffer overrun and corrupted string s
printf("Buffer overrun: s = '%s' (should be 'test')\n", s);
// Since the stack grows from higher to lower addresses, buffer
// overruns can corrupt function return addresses on the stack,
// which can be exploited to run arbitrary code.
}
Wyjście
ZZ
aa bb dd
this is a very long test
dogs like cats
dogs like to chase cars.
Buffer overrun: s = 'ars.' (should be 'test')
Układ zmiennych automatycznych i poziom wykrywania błędów i ochrony kodu mogą się różnić w zależności od zmienionych ustawień kompilatora. Ten przykład może mieć różne wyniki w przypadku kompilowania innych środowisk kompilacji lub innych opcji kompilatora.
Zobacz też
Manipulowanie ciągami
ustawienia regionalne
Interpretacja sekwencji znaków wielobajtowych
_mbsnbcpy
, _mbsnbcpy_l
strcat
, , wcscat
_mbscat
strcmp
, , wcscmp
_mbscmp
strcpy
, , wcscpy
_mbscpy
strncat
, , _strncat_l
, wcsncat
, _wcsncat_l
, , _mbsncat
_mbsncat_l
strncmp
, , wcsncmp
, , _mbsncmp
_mbsncmp_l
_strnicmp
, , _wcsnicmp
, _mbsnicmp
, _strnicmp_l
, , _wcsnicmp_l
_mbsnicmp_l
strrchr
, , wcsrchr
, , _mbsrchr
_mbsrchr_l
_strset
, , _strset_l
, _wcsset
, _wcsset_l
, , _mbsset
_mbsset_l
strspn
, , wcsspn
, , _mbsspn
_mbsspn_l
strncpy_s
, , _strncpy_s_l
, wcsncpy_s
, _wcsncpy_s_l
, , _mbsncpy_s
_mbsncpy_s_l
strcpy_s
, , wcscpy_s
_mbscpy_s