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.
Kopienzeichen aus einer Zeichenfolge zu anderen.Diese sind Versionen von strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l mit Sicherheitserweiterungen, wie in Sicherheitsfeatures im CRT beschrieben.
![]() |
---|
_mbsncpy_s und _mbsncpy_s_l können in Anwendungen nicht verwendet werden, die in der Windows Runtime ausführen.Weitere Informationen finden Sie unter CRT-Funktionen unterstützt nicht mit /ZW. |
errno_t strncpy_s( char *strDest, size_t numberOfElements, const char *strSource, size_t count ); errno_t _strncpy_s_l( char *strDest, size_t numberOfElements, const char *strSource, size_t count, _locale_t locale ); errno_t wcsncpy_s( wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count ); errno_t _wcsncpy_s_l( wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count, _locale_t locale ); errno_t _mbsncpy_s( unsigned char *strDest, size_t numberOfElements, const unsigned char *strSource, size_t count ); errno_t _mbsncpy_s_l( unsigned char *strDest, size_t numberOfElements, const unsigned char *strSource, size_t count, locale_t locale ); template <size_t size> errno_t strncpy_s( char (&strDest)[size], const char *strSource, size_t count ); // C++ only template <size_t size> errno_t _strncpy_s_l( char (&strDest)[size], const char *strSource, size_t count, _locale_t locale ); // C++ only template <size_t size> errno_t wcsncpy_s( wchar_t (&strDest)[size], const wchar_t *strSource, size_t count ); // C++ only template <size_t size> errno_t _wcsncpy_s_l( wchar_t (&strDest)[size], const wchar_t *strSource, size_t count, _locale_t locale ); // C++ only template <size_t size> errno_t _mbsncpy_s( unsigned char (&strDest)[size], const unsigned char *strSource, size_t count ); // C++ only template <size_t size> errno_t _mbsncpy_s_l( unsigned char (&strDest)[size], const unsigned char *strSource, size_t count, locale_t locale ); // C++ only
Parameter
strDest
Zielzeichenfolge.numberOfElements
Die Größe der Zielzeichenfolge, in Zeichen.strSource
Quellzeichenfolge.count
Zahl kopiert werden Zeichen oder _TRUNCATE.locale
Das Gebietsschema zu verwenden.
Rückgabewert
Null erfolgreich, wenn STRUNCATE, wenn Clipping aufgetreten ist; andernfalls ein Fehlercode.
Fehlerbedingungen
strDest |
numberOfElements |
strSource |
Rückgabewert |
Inhalt von strDest |
---|---|---|---|---|
NULL |
any |
any |
EINVAL |
nicht geändert |
any |
any |
NULL |
EINVAL |
strDest[0] auf 0 festgelegt |
any |
0 |
any |
EINVAL |
nicht geändert |
nicht NULL |
zu klein |
any |
ERANGE |
strDest[0] auf 0 festgelegt |
Hinweise
Diese Funktionen versuchen, die ersten D Zeichen aus strSource zu strDest zu kopieren, in dem D die kleinere von count und der Länge von strSource ist.Wenn diese D Zeichen innerhalb strDest (dessen Größe als numberOfElements angegeben ist) und Platz für ein abschließendes noch werden passen, werden diese Zeichen kopiert und ein abschließendes NULL-Zeichen wird angefügt; andernfalls wird strDest[0] zum NULL-Zeichen und den ungültigen Parameterhandler aufgerufen wird festgelegt, wie in Parametervalidierung beschrieben.
Es gibt eine Ausnahme an den oben genannten Absatz.Wenn count_TRUNCATE ist, dann wird so weit von strSource wie in strDest passt, beim Platz für das endgültige NULL-Zeichen Anwendungsentwicklern weiterhin kopiert, das immer angefügt wird.
Beispiel:
char dst[5];
strncpy_s(dst, 5, "a long string", 5);
bedeutet, dass wir um strncpy_s anfordern, um fünf Zeichen in einem Puffer lang zu kopieren fünf; Bytes dieses würde kein Platz für das NULL-Zeichen, was die strncpy_s Nullen standardmäßig die Zeichenfolge und die Aufrufe der ungültige Parameterhandler lassen.
Wenn Abschneidenverhalten erforderlich ist, verwenden Sie _TRUNCATE oder size (- 1):
strncpy_s(dst, 5, "a long string", _TRUNCATE);
strncpy_s(dst, 5, "a long string", 4);
Beachten Sie im Gegensatz strncpy, wenn count größer als die Länge von ist, strSource der Zielzeichenfolge ist NOT, das mit NULL-Zeichen bis zur Länge count aufgefüllt wird.
Das Verhalten von strncpy_s ist nicht definiert, wenn die Quell- und Zielzeichenfolgen überschneiden.
Wenn strDest oder strSourceNULL ist oder numberOfElements 0 ist, wird der ungültige Parameterhandler aufgerufen.Wenn die Ausführung zulässig ist, um fortzufahren, gibt die Funktion EINVAL zurück und legt errno zu EINVAL fest.
wcsncpy_s und _mbsncpy_s sind Breitzeich und Mehrbytezeichen-Versionen von strncpy_s.Die Argumente und der Rückgabewert von wcsncpy_s und mbsncpy_s unterscheiden sich entsprechend.Diese sechs Funktionen verhalten sich andernfalls identisch.
Der Ausgabewert wird durch die Einstellung der LC_CTYPE Kategorieneinstellung des Gebietsschemas betroffen; setlocale finden Sie weitere Informationen.Die Versionen dieser Funktionen ohne das _l Suffix verwenden das aktuelle Gebietsschema für dieses Verhalten abhängig; die Versionen mit dem _l Suffix sind identisch, allerdings verwenden den Gebietsschemaparameter, der in stattdessen übergeben wird.Weitere Informationen finden Sie unter Gebietsschema.
In C++ mithilfe dieser Funktionen wird durch Vorlagenüberladungen vereinfacht; die Überladungen können die Pufferlänge (die Anforderung automatisch beseitigend ableiten, ein Größenargument anzugeben) und können die älteren, nicht-sicheren Funktionen durch ihre späteren, sicheren Entsprechungen automatisch ersetzen.Weitere Informationen finden Sie unter Speichern Sie Vorlagen-Überladungen.
Die Debugversionen dieser Funktionen füllen zuerst den Puffer mit den Wert aus.Um dieses Verhalten zu deaktivieren, verwenden Sie _CrtSetDebugFillThreshold.
Zuordnung generische Textroutinen
TCHAR.H-Routine |
_UNICODE & _MBCS nicht definiert. |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_tcsncpy_s |
strncpy_s |
_mbsnbcpy_s |
wcsncpy_s |
_tcsncpy_s_l |
_strncpy_s_l |
_mbsnbcpy_s_l |
_wcsncpy_s_l |
![]() |
---|
_strncpy_s_l, _wcsncpy_s_l und _mbsncpy_s_l haben keine Gebietsschemaabhängigkeit und werden nur für _tcsncpy_s_l bereitgestellt und nicht vorgesehen, diese direkt aufgerufen werden. |
Anforderungen
Routine |
Erforderlicher Header |
---|---|
strncpy_s, _strncpy_s_l |
<string.h> |
wcsncpy_s, _wcsncpy_s_l |
<string.h> oder <wchar.h> |
_mbsncpy_s, _mbsncpy_s_l |
<mbstring.h> |
So zusätzlicher Kompatibilitätsinformation finden Sie unter Kompatibilität in der Einführung.
Beispiel
// crt_strncpy_s_1.cpp
// compile with: /MTd
// these #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h> // For _CrtSetReportMode
#include <errno.h>
// This example uses a 10-byte destination buffer.
errno_t strncpy_s_tester( const char * src,
int count )
{
char dest[10];
printf( "\n" );
if ( count == _TRUNCATE )
printf( "Copying '%s' to %d-byte buffer dest with truncation semantics\n",
src, _countof(dest) );
else
printf( "Copying %d chars of '%s' to %d-byte buffer dest\n",
count, src, _countof(dest) );
errno_t err = strncpy_s( dest, _countof(dest), src, count );
printf( " new contents of dest: '%s'\n", dest );
return err;
}
void Examples()
{
strncpy_s_tester( "howdy", 4 );
strncpy_s_tester( "howdy", 5 );
strncpy_s_tester( "howdy", 6 );
printf( "\nDestination buffer too small:\n" );
strncpy_s_tester( "Hi there!!", 10 );
printf( "\nTruncation examples:\n" );
errno_t err = strncpy_s_tester( "How do you do?", _TRUNCATE );
printf( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
err = strncpy_s_tester( "Howdy.", _TRUNCATE );
printf( " truncation %s occur\n", err == STRUNCATE ? "did"
: "did not" );
printf( "\nSecure template overload example:\n" );
char dest[10];
strncpy( dest, "very very very long", 15 );
// With secure template overloads enabled (see #defines at
// top of file), the preceding line is replaced by
// strncpy_s( dest, _countof(dest), "very very very long", 15 );
// Instead of causing a buffer overrun, strncpy_s invokes
// the invalid parameter handler.
// If secure template overloads were disabled, strncpy would
// copy 15 characters and overrun the dest buffer.
printf( " new contents of dest: '%s'\n", dest );
}
void myInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}
int main( void )
{
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
Examples();
}
// crt_strncpy_s_2.c
// contrasts strncpy and strncpy_s
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char a[20] = "test";
char s[20];
// simple strncpy usage:
strcpy_s( s, 20, "dogs like cats" );
printf( "Original string:\n '%s'\n", s );
// Here we can't use strncpy_s since we don't
// want null termination
strncpy( s, "mice", 4 );
printf( "After strncpy (no null-termination):\n '%s'\n", s );
strncpy( s+5, "love", 4 );
printf( "After strncpy into middle of string:\n '%s'\n", s );
// If we use strncpy_s, the string is terminated
strncpy_s( s, _countof(s), "mice", 4 );
printf( "After strncpy_s (with null-termination):\n '%s'\n", s );
}
.NET Framework-Entsprechung
Siehe auch
Referenz
Zeichenfolgenbearbeitung (CRT)
Interpretation von Mehrbytezeichen-Sequenzen
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l