Sdílet prostřednictvím


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é

_mbsncpya _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 EINVALhodnotu .

wcsncpya _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