strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
Zkopírujte jeden řetězec znaků do jiného.Bezpečnější verze tyto funkce jsou k dispozici; see strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.
Důležité |
---|
_mbsncpya _mbsncpy_l nelze použít v aplikacích, které jsou spuštěny v Windows Runtime.Další informace naleznete v tématu CRT funkce nejsou podporovány s /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
Cílový řetězec.strSource
Zdrojový řetězec.count
Počet znaků, které mají být zkopírovány.locale
Chcete-li národní prostředí pro použití.
Vrácená hodnota
Vrátí strDest.Žádné vrácená hodnota je vyhrazena udávající chybu.
Poznámky
strncpy Funkce zkopíruje počáteční count znaky strSource na strDest a vrátí strDest.Pokud count je menší nebo rovna délce strSource, znak null nejsou automaticky připojeny k zkopírované řetězec.Pokud count je větší než délka strSource, je cílový řetězec ohraničen znaky null až do délky count.Chování strncpy není definován, je-li překrytí řetězce zdrojové a cílové.
Poznámka k zabezpečení |
---|
strncpynehledá dostatečný prostor v strDest; Díky tomu je možná příčina chyby přetečení vyrovnávací paměti.count Argument omezí počet znaků, které jsou zkopírovány; není omezení na velikost strDest.Viz následující příklad.Další informace naleznete v tématu Zamezení způsobí přetečení vyrovnávací paměti. |
Pokud strDest nebo strSource je NULL ukazatel, nebo pokud count je menší nebo rovna nule, je vyvolána obslužná rutina neplatný parametr, jak je popsáno v Ověření parametrů.Pokud je povoleno spuštění pokračovat, vrátí tyto funkce hodnotu -1 a errno kEINVAL
wcsncpya _mbsncpy jsou verze širokého znaku a vícebajtové znakové sady strncpy.Argumenty a vrácené hodnoty wcsncpy a _mbsncpy se liší podle toho.Těchto šest funkcí chovat identicky jinak.
Verze těchto funkcí se _l přípony jsou shodné s tím rozdílem, že používají národní prostředí předána namísto aktuální národní prostředí pro jejich chování závislé na národním prostředí.Další informace naleznete v tématu Národní prostředí.
V jazyce C++ mají tyto funkce šablony přetížení, které vyvolávají novější, bezpečné protějšky těchto funkcí.Další informace naleznete v tématu Přetížení šablony zabezpečení.
Mapování rutiny obecného textu
TCHAR.Byla zahájena rutina h |
_UNICODE & _MBCS není definováno |
_MBCS, definice |
_UNICODE definována |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
[!POZNÁMKA]
_strncpy_la _wcsncpy_l mít závislost národního prostředí; jsou poskytovány pouze pro _tcsncpy_l a nemají být volán přímo.
Požadavky
Byla zahájena rutina |
Požadované záhlaví |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> nebo <wchar.h> |
_mbsncpy, _mbsncpy_l |
<mbstring.h> |
Platformu pro další informace týkající se kompatibility naleznete v tématu Compatibility.
Příklad
Následující příklad ukazuje použití strncpy a jak může být zneužito programové chyby a problémy se zabezpečením.Kompilátor vygeneruje upozornění pro každé volání strncpy podobnácrt_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.
}
Výsledek
Rozložení automatické proměnné a úroveň ochrany zjišťování a kód chyby se může lišit s nastavením změněné kompilátoru.V tomto příkladu může mít různé výsledky při sestavení v jiných prostředích kompilace nebo s jinými možnostmi kompilátoru.
Ekvivalent v rozhraní .NET Framework
Viz také
Referenční dokumentace
Výklad vícebajtové znakové sekvence
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