strncpy_s
, _strncpy_s_l
, , wcsncpy_s
, _mbsncpy_s
_wcsncpy_s_l
, _mbsncpy_s_l
_tcsncpy_s
_tcsncpy_s_l
, , _tcsnccpy_s
_tcsnccpy_s_l
Zkopíruje znaky jednoho řetězce do druhého. Tyto verze , , _strncpy_l
wcsncpy
, _wcsncpy_l
, _mbsncpy
mají _mbsncpy_l
vylepšení zabezpečení, jak je popsáno v funkcích zabezpečení v CRT.strncpy
Důležité
_mbsncpy_s
a _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é.
Pro _tcsnccpy_s
, _tcsnccpy_s_l
_tcsnccpy_s
a _tcsnccpy_s_l
viz mapování obecných textových funkcí.
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 NULL
numberOfElements
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_s
a _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í obecných textových funkcí
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_l
a _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