Sdílet prostřednictvím


strncpy_s, _strncpy_s_l, wcsncpy_s, , _mbsncpy_s_wcsncpy_s_l, _mbsncpy_s_l, , _tcsnccpy_s_tcsnccpy_s_l

Zkopíruje znaky jednoho řetězce do druhého. Tyto verze , , _strncpy_lwcsncpy, _wcsncpy_l, _mbsncpymají _mbsncpy_lvylepšení zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.strncpy

Důležité

_mbsncpy_sa _mbsncpy_s_l nelze je použít v aplikacích, které se spouští v prostředí Windows Runtime. Další informace najdete v tématu Funkce CRT, které nejsou v aplikacích Univerzální platforma Windows podporované.

_tcsnccpy_s_lA _tcsnccpy_s viz mapování rutin obecného textu.

Syntaxe

errno_t strncpy_s(
   char *strDest,
   size_t numberOfElements,
   const char *strSource,
   size_t count
);
errno_t _strncpy_s_l(
   char *strDest,
   size_t numberOfElements,
   const char *strSource,
   size_t count,
   _locale_t locale
);
errno_t wcsncpy_s(
   wchar_t *strDest,
   size_t numberOfElements,
   const wchar_t *strSource,
   size_t count
);
errno_t _wcsncpy_s_l(
   wchar_t *strDest,
   size_t numberOfElements,
   const wchar_t *strSource,
   size_t count,
   _locale_t locale
);
errno_t _mbsncpy_s(
   unsigned char *strDest,
   size_t numberOfElements,
   const unsigned char *strSource,
   size_t count
);
errno_t _mbsncpy_s_l(
   unsigned char *strDest,
   size_t numberOfElements,
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
);
template <size_t size>
errno_t strncpy_s(
   char (&strDest)[size],
   const char *strSource,
   size_t count
); // C++ only
template <size_t size>
errno_t _strncpy_s_l(
   char (&strDest)[size],
   const char *strSource,
   size_t count,
   _locale_t locale
); // C++ only
template <size_t size>
errno_t wcsncpy_s(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count
); // C++ only
template <size_t size>
errno_t _wcsncpy_s_l(
   wchar_t (&strDest)[size],
   const wchar_t *strSource,
   size_t count,
   _locale_t locale
); // C++ only
template <size_t size>
errno_t _mbsncpy_s(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count
); // C++ only
template <size_t size>
errno_t _mbsncpy_s_l(
   unsigned char (&strDest)[size],
   const unsigned char *strSource,
   size_t count,
   _locale_t locale
); // C++ only

Parametry

strDest
Cílový řetězec.

numberOfElements
Velikost cílového řetězce ve znaznachu.

strSource
Zdrojový řetězec.

count
Počet znaků, které se mají zkopírovat, nebo _TRUNCATE.

locale
Národní prostředí, které se má použít

Vrácená hodnota

Nula v případě úspěchu, STRUNCATE pokud došlo ke zkrácení, jinak kód chyby.

Chybové podmínky

strDest numberOfElements strSource Vrácená hodnota Obsah strDest
NULL jakékoliv jakékoliv EINVAL neupraveno
jakékoliv jakékoliv NULL EINVAL strDest[0] nastaveno na hodnotu 0
jakékoliv 0 jakékoliv EINVAL neupraveno
ne NULL příliš malý jakékoliv ERANGE strDest[0] nastaveno na hodnotu 0

Poznámky

Tyto funkce se snaží zkopírovat první D znaky strSource do strDest, kde D je menší než count a délka strSource. Pokud se tyto D znaky vejdou do strDest (jejichž velikost je zadána jako numberOfElements) a přesto ponechá prostor pro ukončovací znak null, zkopírují se tyto znaky a připojí se koncová hodnota null. Jinak strDest[0] se nastaví na znak null a vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru.

Existuje výjimka z výše uvedeného odstavce. Pokud count ano _TRUNCATE, pak se zkopíruje tolik, strSource jak se do něj zapadne strDest , a přitom zůstane místo pro ukončení hodnoty null, která se vždy připojí.

Příklad:

char dst[5];
strncpy_s(dst, 5, "a long string", 5);

znamená, že strncpy_s zkopíruje pět znaků do 5bajtů vyrovnávací paměti. Tato kopie by nezanechovala žádné místo pro ukončovací znak null, takže strncpy_s vynuluje řetězec a volá neplatnou obslužnou rutinu parametru.

Pokud je potřeba zkrátit chování, použijte _TRUNCATE nebo (size - 1):

strncpy_s(dst, 5, "a long string", _TRUNCATE);
strncpy_s(dst, 5, "a long string", 4);

Na rozdíl od strncpy, pokud count je větší než délka strSource, cílový řetězec není vycpaný znaky null až do délky count.

Chování strncpy_s není definováno, pokud se zdrojový a cílový řetězec překrývají.

Pokud strDest je nebo je nebo strSource je NULLnumberOfElements 0, je vyvolána neplatná obslužná rutina parametru. Pokud je spuštění povoleno pokračovat, funkce vrátí EINVAL a nastaví errno na EINVAL.

wcsncpy_sa _mbsncpy_s jsou širokoznakové a vícebajtové verze .strncpy_s Argumenty a návratová wcsncpy_s hodnota a mbsncpy_s odpovídajícím způsobem se liší. Těchto šest funkcí se chová stejně jinak.

Výstupní hodnota je ovlivněna nastavením LC_CTYPE nastavení kategorie národního prostředí. Další informace najdete na webu setlocale. Verze těchto funkcí bez _l přípony používají aktuální národní prostředí pro toto chování závislé na národním prostředí. Verze s _l příponou jsou shodné s tím rozdílem, že místo toho používají předaný parametr národního prostředí. Další informace naleznete v tématu Národní prostředí.

V jazyce C++ je použití těchto funkcí zjednodušeno přetíženími šablon; přetížení mohou automaticky odvodit délku vyrovnávací paměti (eliminuje potřebu zadat argument velikosti) a mohou automaticky nahradit starší, nezabezpečené funkce jejich novějšími zabezpečenými protějšky. Další informace naleznete v tématu Přetížení šablon zabezpečení.

Verze knihovny ladění těchto funkcí nejprve vyplní vyrovnávací paměť 0xFE. Chcete-li toto chování zakázat, použijte _CrtSetDebugFillThreshold.

Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.

Mapování rutin obecného textu

Funkce ve sloupci tchar.h se mapuje na funkci v ostatních sloupcích v závislosti na znakové sadě, která je definována v době kompilace.

tchar.h rutina _UNICODE a _MBCS není definován _MBCS definovaný _UNICODE definovaný
_tcsncpy_s strncpy_s _mbsnbcpy_s wcsncpy_s
_tcsncpy_s_l _strncpy_s_l _mbsnbcpy_s_l _wcsncpy_s_l
_tcsnccpy_s strncpy_s _mbsncpy_s _wcsncpy_s
_tcsnccpy_s_l _strncpy_s_l _mbsncpy_s_l _wcsncpy_s_l

Poznámka:

_strncpy_s_la _wcsncpy_s_l _mbsncpy_s_l nemají žádnou závislost na národním prostředí. Jsou poskytovány pouze pro _tcsncpy_s_l a nejsou určeny k přímému zavolání.

Požadavky

Rutina Požadovaný hlavičkový soubor
strncpy_s, _strncpy_s_l <string.h>
wcsncpy_s, _wcsncpy_s_l <string.h> nebo <wchar.h>
_mbsncpy_s, _mbsncpy_s_l <mbstring.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad: Kopírování znaků do vyrovnávací paměti

// crt_strncpy_s_1.cpp
// compile with: /MTd

// these #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>  // For _CrtSetReportMode
#include <errno.h>

// This example uses a 10-byte destination buffer.

errno_t strncpy_s_tester( const char * src,
                          int count )
{
   char dest[10];

   printf( "\n" );

   if ( count == _TRUNCATE )
      printf( "Copying '%s' to %d-byte buffer dest with truncation semantics\n",
               src, _countof(dest) );
   else
      printf( "Copying %d chars of '%s' to %d-byte buffer dest\n",
              count, src, _countof(dest) );

   errno_t err = strncpy_s( dest, _countof(dest), src, count );

   printf( "    new contents of dest: '%s'\n", dest );

   return err;
}

void Examples()
{
   strncpy_s_tester( "howdy", 4 );
   strncpy_s_tester( "howdy", 5 );
   strncpy_s_tester( "howdy", 6 );

   printf( "\nDestination buffer too small:\n" );
   strncpy_s_tester( "Hi there!!", 10 );

   printf( "\nTruncation examples:\n" );

   errno_t err = strncpy_s_tester( "How do you do?", _TRUNCATE );
   printf( "    truncation %s occur\n", err == STRUNCATE ? "did"
                                                       : "did not" );

   err = strncpy_s_tester( "Howdy.", _TRUNCATE );
   printf( "    truncation %s occur\n", err == STRUNCATE ? "did"
                                                       : "did not" );

   printf( "\nSecure template overload example:\n" );

   char dest[10];
   strncpy( dest, "very very very long", 15 );
   // With secure template overloads enabled (see #defines at
   // top of file), the preceding line is replaced by
   //    strncpy_s( dest, _countof(dest), "very very very long", 15 );
   // Instead of causing a buffer overrun, strncpy_s invokes
   // the invalid parameter handler.
   // If secure template overloads were disabled, strncpy would
   // copy 15 characters and overrun the dest buffer.
   printf( "    new contents of dest: '%s'\n", dest );
}

void myInvalidParameterHandler(
   const wchar_t* expression,
   const wchar_t* function,
   const wchar_t* file,
   unsigned int line,
   uintptr_t pReserved)
{
   wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}

int main( void )
{
   _invalid_parameter_handler oldHandler, newHandler;

   newHandler = myInvalidParameterHandler;
   oldHandler = _set_invalid_parameter_handler(newHandler);
   // Disable the message box for assertions.
   _CrtSetReportMode(_CRT_ASSERT, 0);

   Examples();
}
Copying 4 chars of 'howdy' to 10-byte buffer dest
    new contents of dest: 'howd'

Copying 5 chars of 'howdy' to 10-byte buffer dest
    new contents of dest: 'howdy'

Copying 6 chars of 'howdy' to 10-byte buffer dest
    new contents of dest: 'howdy'

Destination buffer too small:

Copying 10 chars of 'Hi there!!' to 10-byte buffer dest
Invalid parameter handler invoked: (L"Buffer is too small" && 0)
    new contents of dest: ''

Truncation examples:

Copying 'How do you do?' to 10-byte buffer dest with truncation semantics
    new contents of dest: 'How do yo'
    truncation did occur

Copying 'Howdy.' to 10-byte buffer dest with truncation semantics
    new contents of dest: 'Howdy.'
    truncation did not occur

Secure template overload example:
Invalid parameter handler invoked: (L"Buffer is too small" && 0)
    new contents of dest: ''

Příklad: strncpy a strncpy_s

// crt_strncpy_s_2.c
// contrasts strncpy and strncpy_s

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
   char a[20] = "test";
   char s[20];

   // simple strncpy usage:

   strcpy_s( s, 20, "dogs like cats" );
   printf( "Original string:\n   '%s'\n", s );

   // Here we can't use strncpy_s since we don't
   // want null termination
   strncpy( s, "mice", 4 );
   printf( "After strncpy (no null-termination):\n   '%s'\n", s );
   strncpy( s+5, "love", 4 );
   printf( "After strncpy into middle of string:\n   '%s'\n", s );

   // If we use strncpy_s, the string is terminated
   strncpy_s( s, _countof(s), "mice", 4 );
   printf( "After strncpy_s (with null-termination):\n   '%s'\n", s );

}
Original string:
   'dogs like cats'
After strncpy (no null-termination):
   'mice like cats'
After strncpy into middle of string:
   'mice love cats'
After strncpy_s (with null-termination):
   'mice'

Viz také

Manipulace s řetězci
Národní prostředí
Interpretace vícebajtových sekvencí znaků
_mbsnbcpy, _mbsnbcpy_l
strcat_s, , wcscat_s_mbscat_s
strcmp, , wcscmp_mbscmp
strcpy_s, , wcscpy_s_mbscpy_s
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, , _mbsncat_s_mbsncat_s_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