Namespaces
Variants

strcat, strcat_s

Von de.cppreference.net
Definiert in Header <string.h>
char* strcat( char* dest, const char* src );
(1) (bis C99)
char* strcat( char* restrict dest, const char* restrict src );
(seit C99)
errno_t strcat_s(char* restrict dest, rsize_t destsz, const char* restrict src);
(2) (seit C11)
1) Hängt eine Kopie der nullterminierten Byte-Zeichenkette, auf die src an das Ende der nullterminierten Byte-Zeichenkette, auf die dest an. Das Zeichen src[0] ersetzt das Nullterminator am Ende von dest. Die resultierende Byte-Zeichenkette ist nullterminiert.
Das Verhalten ist undefiniert, wenn das Zielarray nicht groß genug für den Inhalt von src und dest und das abschließende Nullzeichen ist. Das Verhalten ist undefiniert, wenn sich die Zeichenketten überschneiden. Das Verhalten ist undefiniert, wenn entweder dest oder src kein Zeiger auf eine nullterminierte Byte-Zeichenkette ist.
2) Verhalten wie (1), mit der Ausnahme, dass der Rest des Zielarrays (vom letzten geschriebenen Zeichen bis destsz) 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 ein Nullzeiger ist
  • destsz Null oder größer als RSIZE_MAX
  • in den ersten destsz Bytes von dest
  • kein Nullterminator vorhanden istdest eine Abschneidung stattfinden würde (der verfügbare Platz am Ende von src würde nicht für jedes Zeichen, einschließlich des Nullterminators, von
  • ausreichen)
eine Überschneidung zwischen der Quell- und der Zielzeichenkette auftreten würdedest < strlen(dest)+strlen(src)+1 < Das Verhalten ist undefiniert, wenn die Größe des Zeichenarrays, auf das destsz= destsz; mit anderen Worten, ein fehlerhafter Wert von
macht den drohenden Pufferüberlauf nicht sichtbar.strcat_s Wie bei allen bereichsgeprüften Funktionen ist __STDC_LIB_EXT1__ nur dann garantiert verfügbar, wenn __STDC_WANT_LIB_EXT1__ von der Implementierung definiert ist und der Benutzer 1 auf die ganzzahlige Konstante < setzt, bevor er >string.h

Siehe auch

Parameter dest -
Zeiger auf die nullterminierte Byte-Zeichenkette, an die angehängt werden soll src -
Zeiger auf die nullterminierte Byte-Zeichenkette, von der kopiert werden soll destsz -

maximale Anzahl von zu schreibenden Zeichen, normalerweise die Größe des Zielpuffers

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

).

AnmerkungenstrcatDa dest jedes Mal das Ende von strcat finden muss, ist es ineffizient, viele Zeichenketten mit

strcat_s zu verketten. destsz darf das Zielarray vom letzten geschriebenen Zeichen bis zu

überschreiben, um die Effizienz zu verbessern: es kann in Multibyte-Blöcken kopieren und dann auf Nullbytes prüfen. strcat_sDie Funktion ist ähnlich zur strlcatBSD-Funktion

  • strlcat, mit dem Unterschied, dass
  • strlcat die Quellzeichenkette abschneidet, um in das Ziel zu passenstrcat_s nicht alle Laufzeitprüfungen durchführt, die
  • strlcat durchführt

Fehler nicht offensichtlich macht, indem das Ziel auf eine Nullzeichenkette gesetzt oder ein Handler aufgerufen wird, wenn der Aufruf fehlschlägt.strcat_sObwohl das Abschneiden aufgrund potenzieller Sicherheitsrisiken verbietet, ist es möglich, eine Zeichenkette mit der bereichsgeprüften strncat

stattdessen abzuschneiden.

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

int main(void)
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strcat(str, " ...");
    strcat(str, " Goodbye World!");
    puts(str);

#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcat_s(str, sizeof str, " ... ");
    printf("str = \"%s\", r = %d\n", str, r);
    r = strcat_s(str, sizeof str, " and this is too much");
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

Diesen Code ausführen

Hello World! ... Goodbye World!
str = "Hello World! ... Goodbye World! ... ", r = 0
str = "", r = 22

Mögliche Ausgabe:

  • Referenzen
  • C23-Standard (ISO/IEC 9899:2024):
  • 7.24.3.1 Die strcat-Funktion (p: TBD)
  • K.3.7.2.1 Die strcat_s-Funktion (p: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.24.3.1 Die strcat-Funktion (p: TBD)
  • K.3.7.2.1 Die strcat_s-Funktion (p: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.24.3.1 Die strcat-Funktion (S. 364)
  • K.3.7.2.1 Die strcat_s-Funktion (S. 617-618)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.21.3.1 Die strcat-Funktion (S. 327)
  • C89/C90-Standard (ISO/IEC 9899:1990):

4.11.3.1 Die strcat-Funktion

(C11)
verkettet eine bestimmte Anzahl von Zeichen zweier Zeichenketten
(C11)
kopiert eine Zeichenkette in eine andere
(C23)
kopiert einen Puffer in einen anderen und stoppt nach dem angegebenen Trennzeichen
(Funktion)C++-Dokumentation für
strcat