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.

Wichtiger HinweisWichtig

_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.

SicherheitshinweisSicherheitshinweis

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

HinweisHinweis

_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

System::String::Copy

Siehe auch

Referenz

Zeichenfolgenbearbeitung (CRT)

Gebietsschema

Interpretation von Mehrbytezeichen-Sequenzen

_mbsnbcpy, _mbsnbcpy_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

überprüfte, 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