Udostępnij za pośrednictwem


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

_mbsncpynie 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ść strSourcecią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 strDestelementu . 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.

wcsncpyi _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