strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
Zkopírujte jeden řetězec znaků do jiného.Bezpečnější verze těchto funkcí jsou k dispozici; viz strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.
Důležité |
---|
_mbsncpy a _mbsncpy_l nelze použít v aplikacích, které jsou spouštěny v prostředí 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
Použité národní prostředí.
Vrácená hodnota
Vrátí strDest.Není rezervována žádná vrácená hodnota pro indikaci chyby.
Poznámky
strncpy Funkce kopíruje původní count znaky strSource k strDest a vrátí strDest.Pokud count je menší než délka strSource, znak null nejsou automaticky připojeny k řetězci zkopírované.Pokud count je větší než délka strSource, je cílový řetězec ohraničen znaky null do délky count.Chování strncpy není definováno, pokud se zdrojový a cílový řetězec překrývají.
Poznámka k zabezpečení |
---|
strncpynehledá dostatek místa v strDest; Díky tomu možná příčina přetečení zásobníku.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 Předcházení přetečení vyrovnávací paměti. |
Pokud strDest nebo strSource je NULL ukazatel, nebo -li count je menší nebo rovna na nulovou hodnotu, je vyvolána neplatný parametr obslužné rutiny, jak je popsáno v Ověření parametru.Pokud provádění může pokračovat, vrátí funkce hodnotu -1 a nastaví errno na EINVAL.
wcsncpy a _mbsncpy jsou širokoznaká verze a vícebajtová znaková verze strncpy.Argumenty a vrácené hodnoty wcsncpy a _mbsncpy se odpovídajícím způsobem mění.Těchto šest funkcí se jinak chová identicky.
Verze těchto funkcí s příponou _l jsou identické, s tím rozdílem, že používají pro své chování závislé na národním prostředí předané národní prostředí namísto aktuálního národního prostředí.Další informace naleznete v tématu Národní prostředí.
V jazyce C++ mají tyto funkce přetížení šablon, která vyvolávají novější, zabezpečené protějšky těchto funkcí.Další informace naleznete v tématu Přetížení zabezpečení šablony.
Rutinní mapování obecného textu
Rutina TCHAR.H |
_UNICODE & _MBCS není definováno |
_MBCS definováno |
_UNICODE definováno |
---|---|---|---|
_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 určeny pouze pro _tcsncpy_l a nemají být volán přímo.
Požadavky
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 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 při zjišťování a kód se může měnit nastavení změněných 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 sekvencí vícebajtových znaků
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