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. Siehe 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.
Bemerkungen
Die strncpy
Funktion übernimmt die anfänglichen count
Zeichen strSource
strDest
und gibt strDest
zurück. Wenn count
kleiner oder gleich der Länge des strSource
ist, wird ein Null-Zeichen nicht automatisch an die kopierte Zeichenfolge 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 strSource
ein NULL
-Zeiger ist oder wenn count
kleiner oder gleich 0 ist, wird der Handler für ungültige Parameter aufgerufen, siehe Beschreibung unter Parameter Validation (Parameterüberprüfung). 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 Sichere Vorlagenüberladungen.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dies ändern, erfahren Sie unter Globaler Status in der CRT.
Zuordnung generischer 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, werden nur für _tcsncpy_l
bereitgestellt und sollen nicht direkt aufgerufen werden.
Anforderungen
-Routine zurückgegebener Wert | 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 von strncpy
ähnlich crt_strncpy_x86.c(15)
: Warnung C4996: 'strncpy
': Diese Funktion oder Variable ist möglicherweise unsicher. Erwägen Sie stattdessen die Verwendung von strncpy_s
. Verwenden Sie _CRT_SECURE_NO_WARNINGS
, um die Veraltetität zu deaktivieren. 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 Multibyte-Character Sequenzen
_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