Udostępnij za pośrednictwem


strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

Skopiować znaki jednego ciągu na inny.Bezpieczniejsze wersje te funkcje są dostępne; see strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.

Ważna uwagaWażne

_mbsncpyi _mbsncpy_l nie można używać w aplikacji, których wykonywanie w Środowisko wykonawcze systemu Windows.Aby uzyskać więcej informacji, zobacz CRT funkcje nie obsługiwane przez /ZW.

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 docelowego.

  • strSource
    Ciąg źródłowy.

  • count
    Liczba znaków do skopiowania.

  • locale
    Ustawienia regionalne używane.

Wartość zwracana

Zwraca wartość typu strDest.Nie zwraca żadnej wartości jest zarezerwowany wystąpił błąd.

Uwagi

strncpy Funkcja kopiuje wstępnego count znaków z strSource do strDest i zwraca strDest.Jeśli count jest mniejsza lub równa długości strSource, znak null nie są automatycznie dołączane do skopiowanego ciąg.Jeśli count jest większa niż długość strSource, ciąg docelowy jest wypełniane znakami null do długości count.Zachowanie strncpy jest niezdefiniowana, jeśli nakładają się ciągi źródłowego i docelowego.

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

strncpynie sprawdza wystarczająco dużo miejsca w strDest; Dzięki temu potencjalną przyczynę przekroczenia buforu.count Argument ogranicza liczbę znaków skopiowanych; nie jest limit rozmiaru strDest.Zobacz przykład poniżej.Aby uzyskać więcej informacji, zobacz Unikanie przekroczeniem buforu.

Jeśli strDest lub strSource jest NULL wskaźnik, lub jeśli count jest mniejsza lub równa na zero, program obsługi nieprawidłowy parametr jest wywoływana, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie może kontynuować, funkcje zwracają wartość -1 i ustawić errno doEINVAL

wcsncpyi _mbsncpy szerokich znaków i znaków wielobajtowych wersje strncpy.Argumenty i wartości zwracanej przez wcsncpy i _mbsncpy odpowiednio zmienić.Zmienia tych sześciu funkcji zachowanie takich samych nazwach.

Wersje te funkcje za pomocą _l sufiks są identyczne z tym, że używają ustawień regionalnych, przekazany zamiast bieżących ustawień regionalnych dla ich zachowanie zależne od ustawień lokalnych.Aby uzyskać więcej informacji, zobacz Ustawienia regionalne.

W języku C++ te funkcje mają overloads szablonu, które wywołują odpowiednikami nowych, bezpiecznych funkcji.Aby uzyskać więcej informacji, zobacz Secure, szablon Overloads.

Tekst rodzajowy rutynowych mapowania

TCHAR.Rozpoczęto wykonywanie procedury h

_UNICODE & _MBCS nie zdefiniowany

_MBCS, definicja

_UNICODE, definicja

_tcsncpy

strncpy

_mbsnbcpy

wcsncpy

_tcsncpy_l

_strncpy_l

_mbsnbcpy_l

_wcsncpy_l

[!UWAGA]

_strncpy_li _wcsncpy_l mają ma zależności ustawień regionalnych; są one świadczone tylko dla _tcsncpy_l i nie są przeznaczone do bezpośredniego wywoływania.

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

strncpy

<string.h>

wcsncpy

<string.h> lub <wchar.h>

_mbsncpy, _mbsncpy_l

<mbstring.h>

Aby platformy dodatkowe informacje dotyczące zgodności, zobacz zgodności.

Przykład

Poniższy przykład ilustruje użycie strncpy i jak może być nadużywane powodować błędy programu i problemy dotyczące zabezpieczeń.Kompilator generuje ostrzeżenie dla każdego wywołania strncpy podobne docrt_strncpy_x86.c(15) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

// 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.
}

Dane wyjściowe

  
  

Układ automatyczny zmiennych i poziomu ochrony wykrywania i kod błędu mogą się różnić z kompilatora zmienionych ustawień.W tym przykładzie może mieć różne wyniki, gdy wbudowana w innych środowiskach kompilacji lub z innych opcji kompilatora.

Odpowiednik w programie .NET Framework

System::String::Copy

Zobacz też

Informacje

Manipulowanie ciągami (CRT)

Ustawienia regionalne

Interpretacja sekwencje 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