Namespaces
Variants

strcpy, strcpy_s

Von de.cppreference.net
< c | string | byte
Deklariert im Header <string.h>
char* strcpy( char* dest, const char* src );
(1) (bis C99)
char* strcpy( char* restrict dest, const char* restrict src );
(seit C99)
errno_t strcpy_s( char* restrict dest, rsize_t destsz, const char* restrict src );
(2) (seit C11)
1) Kopiert die nullterminierte Byteketten, auf die src zeigt, einschließlich des Nullterminators, in das Zeichenarray, dessen erstes Element von dest zeigt.
Das Verhalten ist undefiniert, wenn das dest Array nicht groß genug ist. Das Verhalten ist undefiniert, wenn sich die Zeichenketten überlappen. Das Verhalten ist undefiniert, wenn entweder dest kein Zeiger auf ein Zeichenarray ist oder src kein Zeiger auf eine nullterminierte Byteketten ist.
2) Gleich wie (1), außer dass es den Rest des Zielarrays mit unspezifizierten Werten überschreiben darf und dass die folgenden Fehler zur Laufzeit erkannt werden und die derzeit installierte Constraint-Handler Funktion aufrufen:
  • src oder dest ist ein Nullzeiger
  • destsz ist Null oder größer als RSIZE_MAX
  • destsz ist kleiner oder gleich strnlen_s(src, destsz); mit anderen Worten, es würde eine Kürzung auftreten
  • Überlappung zwischen Quell- und Zielzeichenketten würde auftreten
Das Verhalten ist undefiniert, wenn die Größe des Zeichenarrays, auf das dest <= strnlen_s(src, destsz) < destsz zeigt; mit anderen Worten, ein fehlerhafter Wert von destsz setzt den bevorstehenden Pufferüberlauf nicht offen.
Wie bei allen bereichsgeprüften Funktionen ist strcpy_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ als ganzzahlige Konstante 1 definiert, bevor er <string.h> einbindet.

Parameter

dest - Zeiger auf das Zeichenarray, in das geschrieben werden soll
src - Zeiger auf die nullterminierte Byteketten, die kopiert werden soll
destsz - maximale Anzahl der zu schreibenden Zeichen, typischerweise die Größe des Zielpuffers

Rückgabewert

1) gibt eine Kopie von dest
zurück2)dest[0] gibt bei Erfolg Null zurück, bei Fehler einen von Null verschiedenen Wert. Bei einem Fehler wird zudem Null in dest geschrieben (es sei denn, destsz ist ein Nullzeiger oder RSIZE_MAX ist Null oder größer als

).

strcpy_sHinweisedestsz ist erlaubt, das Zielarray ab dem letzten geschriebenen Zeichen bis zu

zu überschreiben, um die Effizienz zu verbessern: Es kann in Multibyte-Blöcken kopieren und dann nach Nullbytes suchen. strcpy_sDie Funktion strlcpy ähnelt der BSD-Funktion

  • strlcpy, außer dass
  • strlcpy die Quellzeichenkette kürzt, um in das Ziel zu passen (was ein Sicherheitsrisiko darstellt)strcpy_s nicht alle Laufzeitprüfungen durchführt, die
  • strlcpy durchführt

Fehler nicht offensichtlich macht, indem das Ziel auf eine leere Zeichenkette gesetzt oder ein Handler aufgerufen wird, wenn der Aufruf fehlschlägt.strcpy_sObwohl die Kürzung aufgrund potenzieller Sicherheitsrisiken verbietet, ist es möglich, eine Zeichenkette mit der bereichsgeprüften strncpy

zu kürzen.

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    const char* src = "Take the test.";
//  src[0] = 'M' ; // this would be undefined behavior
    char dst[strlen(src) + 1]; // +1 to accommodate for the null terminator
    strcpy(dst, src);
    dst[0] = 'M'; // OK
    printf("src = %s\ndst = %s\n", src, dst);

#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcpy_s(dst, sizeof dst, src);
    printf("dst = \"%s\", r = %d\n", dst, r);
    r = strcpy_s(dst, sizeof dst, "Take even more tests.");
    printf("dst = \"%s\", r = %d\n", dst, r);
#endif
}

Diesen Code ausführen

src = Take the test.
dst = Make the test.
dst = "Take the test.", r = 0
dst = "", r = 22

Mögliche Ausgabe:

  • Referenzen
  • C23-Standard (ISO/IEC 9899:2024):
  • 7.24.2.3 Die strcpy-Funktion (S. TBD)
  • K.3.7.1.3 Die strcpy_s-Funktion (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.24.2.3 Die strcpy-Funktion (S. 264–265)
  • K.3.7.1.3 Die strcpy_s-Funktion (S. 447)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.24.2.3 Die strcpy-Funktion (S. 363)
  • K.3.7.1.3 Die strcpy_s-Funktion (S. 615–616)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.21.2.3 Die strcpy-Funktion (S. 326)
  • C89/C90-Standard (ISO/IEC 9899:1990):

4.11.2.3 Die strcpy-Funktion

(C11)
kopiert eine bestimmte Anzahl von Zeichen von einer Zeichenkette in eine andere
(C11)
kopiert einen Puffer in einen anderen
wcscpy_s(C95)
(C11)
kopiert eine Breitzeichenkette in eine andere
(dynamischer Speicher TR)
allokiert eine Kopie einer Zeichenkette
(Funktion)C++-Dokumentation für
strcpy