strncpy
, _strncpy_l
, wcsncpy
, _wcsncpy_l
, , _mbsncpy
_mbsncpy_l
Zkopírujte znaky jednoho řetězce do druhého. K dispozici jsou bezpečnější verze těchto funkcí; viz , , wcsncpy_s
_strncpy_s_l
, _wcsncpy_s_l
, _mbsncpy_s
, _mbsncpy_s_l
.strncpy_s
Důležité
_mbsncpy
a _mbsncpy_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é.
Syntaxe
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é se mají zkopírovat.
locale
Národní prostředí, které se má použít.
Vrácená hodnota
Vrací objekt strDest
. Žádná návratová hodnota není vyhrazena k označení chyby.
Poznámky
Funkce strncpy
zkopíruje počáteční count
znaky strSource
do strDest
a vrátí strDest
. Pokud count
je menší nebo rovna délce strSource
, znak null není automaticky připojen ke zkopírovaným řetězci. Je-li count
větší než délka strSource
, cílový řetězec je vycpaný znaky null až do délky count
. Chování strncpy
není definováno, pokud se zdrojový a cílový řetězec překrývají.
Důležité
strncpy
nezkontroluje dostatečný prostor v strDest
; to z něj činí potenciální příčinu přetečení vyrovnávací paměti. Argument count
omezuje počet zkopírovaných znaků; není omezen velikostí strDest
. Viz následující příklad. Další informace najdete v tématu Zabránění přetečení vyrovnávací paměti.
Pokud strDest
je ukazatel nebo strSource
je NULL
count
menší nebo roven nule, vyvolá se neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povolené provádění pokračovat, vrátí tyto funkce hodnotu -1 a nastaví errno
se na EINVAL
hodnotu .
wcsncpy
a _mbsncpy
jsou širokoznakové a vícebajtové verze .strncpy
Argumenty a návratová wcsncpy
hodnota a _mbsncpy
odpovídajícím způsobem se liší. Těchto šest funkcí se chová stejně jinak.
Verze těchto funkcí s příponou _l
jsou shodné s tím rozdílem, že používají národní prostředí předané místo aktuálního národního 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 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í šablon zabezpečení.
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
TCHAR.H rutina |
_UNICODE a _MBCS není definován |
_MBCS definovaný |
_UNICODE definovaný |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Poznámka:
_strncpy_l
a _wcsncpy_l
nemají žádnou závislost na národním prostředí; jsou poskytovány pouze pro _tcsncpy_l
a nejsou určeny k tomu, aby byly volána přímo.
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> nebo <wchar.h> |
_mbsncpy , _mbsncpy_l |
<mbstring.h> |
Další informace o kompatibilitě platformy najdete v tématu Kompatibilita.
Příklad
Následující příklad ukazuje použití strncpy
a způsob jeho zneužití k příčině chyb programu a problémů se zabezpečením. Kompilátor vygeneruje upozornění pro každé volání strncpy
podobné crt_strncpy_x86.c(15)
: upozornění C4996: 'strncpy
': Tato funkce nebo proměnná může být nebezpečná. Místo toho zvažte použití strncpy_s
. Chcete-li zakázat vyřazení, použijte _CRT_SECURE_NO_WARNINGS
. Podrobnosti najdete v online nápovědě.
// 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ýstup
ZZ
aa bb dd
this is a very long test
dogs like cats
dogs like to chase cars.
Buffer overrun: s = 'ars.' (should be 'test')
Rozložení automatických proměnných a úroveň detekce chyb a ochrany kódu se může lišit se změněným nastavením kompilátoru. Tento příklad může mít jiné výsledky, pokud jsou integrované v jiných prostředích kompilace nebo s jinými možnostmi kompilátoru.
Viz také
Manipulace s řetězci
Národní prostředí
Interpretace vícebajtových sekvencí znaků
_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