strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l
Kopienzeichen aus einer Zeichenfolge zu anderen.Sicherere Versionen dieser Funktionen sind verfügbar; finden Sie unter strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l.
Wichtig |
---|
_mbsncpy und _mbsncpy_l können in Anwendungen nicht verwendet werden, die in Windows-Runtime ausführen.Weitere Informationen finden Sie unter CRT-Funktionen unterstützt nicht mit /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
Parameter
strDest
Zielzeichenfolge.strSource
Quellzeichenfolge.count
Zahl kopiert werden Zeichen.locale
Zu verwendende Gebietsschema.
Rückgabewert
Gibt strDest zurück.Kein Rückgabewert wird reserviert, um einen Fehler anzugeben.
Hinweise
Die strncpy-Funktion kopiert die ursprünglichen count Zeichen aus strSource zu strDest und gibt strDest zurück.Wenn count kleiner oder gleich der Länge von strSource ist, wird ein NULL-Zeichen nicht automatisch zur kopierten Zeichenfolge angehängt.Wenn count größer als die Länge von strSource ist, wird die Zielzeichenfolge mit NULL-Zeichen bis zur Länge count aufgefüllt.Das Verhalten von strncpy ist nicht definiert, wenn die Quell- und Zielzeichenfolgen überschneiden.
Sicherheitshinweis |
---|
strncpy überprüft nicht für genügend Speicherplatz in strDest; dieses macht es eine mögliche Ursache von den Pufferüberläufe.Das count-Argument begrenzt die Anzahl der kopierten Zeichen ein; Es ist keine Grenzwert für die Größe von strDest.(Siehe nachstehendes Beispiel.)Weitere Informationen finden Sie unter Vermeiden von Pufferüberläufen. |
Wenn strDest oder strSource ein NULL Zeiger ist oder wenn count kleiner oder gleich null ist, wird der ungültige Parameterhandler aufgerufen, wie in Parametervalidierung beschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, geben diese Funktionen -1 und Menge errno zu EINVAL zurück
wcsncpy und _mbsncpy sind Breitzeich und Mehrbytezeichen-Versionen von strncpy.Die Argumente und der Rückgabewert von wcsncpy und _mbsncpy unterscheiden sich entsprechend.Diese sechs Funktionen verhalten sich andernfalls identisch.
Die Versionen dieser Funktionen mit dem _l Suffix sind identisch, allerdings verwenden das Gebietsschema, das in anstelle des aktuellen Gebietsschemas für ihren gebietsschemaabhängiges Verhalten übergeben wird.Weitere Informationen finden Sie unter Gebietsschema.
In C++ sind diese Funktionen Vorlagenüberladungen, die aufrufen, das später, speichern Entsprechungen dieser Funktionen.Weitere Informationen finden Sie unter Speichern Sie Vorlagen-Überladungen.
Zuordnung generische Textroutinen
TCHAR.H-Routine |
_UNICODE & _MBCS nicht definiert. |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_tcsncpy |
strncpy |
_mbsnbcpy |
wcsncpy |
_tcsncpy_l |
_strncpy_l |
_mbsnbcpy_l |
_wcsncpy_l |
Hinweis |
---|
_strncpy_l und _wcsncpy_l haben keine Gebietsschemaabhängigkeit; Sie werden nur für _tcsncpy_l bereitgestellt und nicht vorgesehen, diese direkt aufgerufen werden. |
Anforderungen
Routine |
Erforderlicher Header |
---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> oder <wchar.h> |
_mbsncpy, _mbsncpy_l |
<mbstring.h> |
So zusätzlicher Plattformkompatibilitätsinformation finden Sie unter Kompatibilität.
Beispiel
Im folgenden Beispiel wird die Verwendung von strncpy und wie es missbraucht werden kann, um Programmfehler und -Sicherheitsfragen zu verursachen.Der Compiler generiert eine Warnung für jeden Aufruf strncpy, das dem 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. ähnelt
// 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.
}
Ausgabe
Das Layout von automatischen Variablen und der Ebene der Fehlererkennung und des Codeschutzes kann mit geänderten Compilereinstellungen variieren.In diesem Beispiel hat möglicherweise andere Ergebnisse, wenn andere Kompilierungsumgebung integriert oder mit anderen Compileroptionen.
.NET Framework-Entsprechung
Siehe auch
Referenz
Zeichenfolgenbearbeitung (CRT)
Interpretation von Mehrbytezeichen-Sequenzen
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