strncpy
, , _strncpy_l
wcsncpy
, _wcsncpy_l
, , _mbsncpy
_mbsncpy_l
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 strSource
strDest
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 EINVAL
fest.
wcsncpy
und _mbsncpy
sind Breitzeichen- und Multibytezeichenversionen 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 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_WARNINGS
zum 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_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