Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kopieren von Zeichen aus einer Zeichenfolge in eine andere. Sicherere Versionen dieser Funktionen sind verfügbar. Informationen dazu 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 nicht in Anwendungen verwendet werden, die in Windows-Runtime ausgeführt werden. Weitere Informationen finden Sie im Artikel CRT functions not supported in Universal Windows Platform apps (In Apps für die universelle Windows-Plattform nicht unterstützte CRT-Funktionen).
Syntax
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
Anzahl der zu kopierenden Zeichen.
locale
Zu verwendendes Gebietsschema.
Rückgabewert
Gibt strDest zurück. Kein Rückgabewert ist zur Fehleranzeige reserviert.
Hinweise
Die strncpy Funktion übernimmt die anfänglichen count Zeichen strSourcestrDest und gibt strDest zurück. Wenn count die Länge kleiner oder gleich der Länge ist strSource, wird an die kopierte Zeichenfolge kein NULL-Zeichen automatisch angefügt. Wenn count größer als die Länge von strSource ist, wird die Zielzeichenfolge mit Nullzeichen bis zu einer Länge von count aufgefüllt. Wenn sich Quell- und Zielzeichenfolgen überlappen, ist das Verhalten von strncpy undefiniert.
Wichtig
strncpy überprüft strDest nicht auf genügend Speicherplatz; Daher ist dies eine mögliche Ursache von Pufferüberläufen. Das count-Argument begrenzt die Anzahl der kopierten Zeichen; es handelt sich nicht um eine Begrenzung der Größe von strDest. Siehe folgendes Beispiel. Weitere Informationen finden Sie unter Vermeiden von Pufferüberläufen.
Wenn strDest oder ein NULL Zeiger ist oder count strSource kleiner oder gleich Null ist, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, geben diese Funktionen "– 1" zurück und legen errno auf EINVALfest.
wcsncpy und _mbsncpy sind Breitzeichen- und Multibytezeichenversionen von strncpy. Die Argumente und der Rückgabewert von wcsncpy und _mbsncpyunterscheiden sich entsprechend. Diese sechs Funktionen verhalten sich andernfalls identisch.
Die Versionen dieser Funktionen mit dem _l-Suffix sind beinahe identisch, verwenden jedoch das ihnen übergebene Gebietsschema anstelle des aktuellen Gebietsschemas für ihr vom Gebietsschema abhängiges Verhalten. Weitere Informationen finden Sie unter Locale.
In C++ haben diese Funktionen Vorlagenüberladungen, mit denen die neueren, sicheren Entsprechungen dieser Funktionen aufgerufen werden. Weitere Informationen finden Sie unter Secure Template Overloads.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Mapping generischer Textroutinen
TCHAR.H-Routine |
_UNICODE und _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, werden nur für _tcsncpy_l bereitgestellt und sollen nicht direkt aufgerufen werden.
Anforderungen
| Routine | Erforderlicher Header |
|---|---|
strncpy |
<string.h> |
wcsncpy |
<string.h> oder <wchar.h> |
_mbsncpy, _mbsncpy_l |
<mbstring.h> |
Weitere Informationen zur Plattformkompatibilität finden Sie unter "Kompatibilität".
Beispiel
Das folgende Beispiel veranschaulicht die Verwendung von strncpy und wie es missbraucht werden kann, um Fehler und Sicherheitslücken im Programm hervorzurufen. Der Compiler generiert eine Warnung für jeden Aufruf ähnlich strncpy wie crt_strncpy_x86.c(15) : Warnung C4996: 'strncpy': Diese Funktion oder Variable ist möglicherweise unsicher. Erwägen Sie stattdessen die Verwendung strncpy_s . Verwenden Sie _CRT_SECURE_NO_WARNINGSzum Deaktivieren der Deaktivierung . Weitere Informationen finden Sie in der Onlinehilfe.
// 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.
}
Output
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')
Das Layout von automatischen Variablen und die Ebene der Fehlererkennung und der Codeschutz kann durch geänderte Compilereinstellungen variieren. Durch dieses Beispiel können sich unterschiedliche Ergebnisse ergeben, wenn es in andere Kompilierungsumgebungen oder mit anderen Compileroptionen integriert wird.
Siehe auch
Zeichenfolgenbearbeitung
Gebietsschema
Interpretation von Multibytezeichensequenzen
_mbsnbcpy, _mbsnbcpy_l
strcat, wcscat_mbscat
strcmp, wcscmp_mbscmp
strcpy, wcscpy_mbscpy
strncat, , _strncat_lwcsncat, _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_lwcsncpy_s, _wcsncpy_s_l, , _mbsncpy_s_mbsncpy_s_l
strcpy_s, wcscpy_s_mbscpy_s