Namespaces
Variants

strcat, strcat_s

From cppreference.net
< c ‎ | string ‎ | byte
Definiert im Header <string.h>
(1)
char * strcat ( char * dest, const char * src ) ;
(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) Fügt eine Kopie der nullterminierten Byte-Zeichenkette, auf die src zeigt, an das Ende der nullterminierten Byte-Zeichenkette an, auf die dest zeigt. Das Zeichen src[0] ersetzt den Null-Terminator am Ende von dest . Die resultierende Byte-Zeichenkette ist nullterminiert.
Das Verhalten ist undefiniert, wenn das Zielarray nicht groß genug für die Inhalte von sowohl src als auch dest und das abschließende Nullzeichen ist. Das Verhalten ist undefiniert, wenn sich die Zeichenketten überlappen. Das Verhalten ist undefiniert, wenn entweder dest oder src kein Zeiger auf eine nullterminierte Byte-Zeichenkette ist.
2) Gleich wie (1) , außer dass es den Rest des Zielarrays (ab dem letzten geschriebenen Zeichen bis destsz ) mit unspezifizierten Werten überschreiben kann und dass die folgenden Fehler zur Laufzeit erkannt werden und den aktuell installierten constraint handler aufrufen:
  • src oder dest ist ein null pointer
  • destsz ist null oder größer als RSIZE_MAX
  • es gibt keinen null terminator in den ersten destsz Bytes von dest
  • truncation würde auftreten (der verfügbare Platz am Ende von dest würde nicht jedes Zeichen, einschließlich des null terminators, von src aufnehmen)
  • overlap würde zwischen den Quell- und Zielzeichenfolgen auftreten
Das Verhalten ist undefiniert, wenn die Größe des Zeichenarrays, auf das dest zeigt, < strlen ( dest ) + strlen ( src ) + 1 <= destsz ; mit anderen Worten, ein fehlerhafter Wert von destsz macht den drohenden Pufferüberlauf nicht offensichtlich.
Wie bei allen grenzprüfenden Funktionen ist strcat_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <string.h> eingebunden wird.

Inhaltsverzeichnis

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 der zu schreibenden Zeichen, typischerweise die Größe des Zielpuffers

Rückgabewert

1) gibt eine Kopie von dest zurück
2) gibt bei Erfolg Null zurück, gibt bei Fehler einen Wert ungleich Null zurück. Außerdem wird bei einem Fehler Null in dest [ 0 ] geschrieben (sofern dest kein Nullzeiger ist und destsz weder Null noch größer als RSIZE_MAX ist).

Hinweise

Da strcat bei jedem Aufruf bis zum Ende von dest suchen muss, ist es ineffizient, viele Strings mit strcat zu einem zu verketten.

strcat_s darf den Zielarray ab dem letzten geschriebenen Zeichen bis zu destsz überschreiben, um die Effizienz zu verbessern: Es kann in Multibyte-Blöcken kopieren und dann auf Nullbytes prüfen.

Die Funktion strcat_s ist ähnlich der BSD-Funktion strlcat , mit der Ausnahme, dass

  • strlcat kürzt den Quellstring, damit er in das Ziel passt
  • strlcat führt nicht alle Laufzeitprüfungen durch, die strcat_s durchführt
  • strlcat macht Fehler nicht offensichtlich, indem es das Ziel auf einen Null-String setzt oder einen Handler aufruft, wenn der Aufruf fehlschlägt.

Obwohl strcat_s aufgrund potenzieller Sicherheitsrisiken keine Abschneidung erlaubt, ist es möglich, einen String mithilfe der grenzprüfenden Funktion strncat_s abzuschneiden.

Beispiel

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> 
#include <stdio.h>
#include <stdlib.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
}

Mögliche Ausgabe:

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

Referenzen

  • 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

Siehe auch

verkettet eine bestimmte Anzahl von Zeichen zweier Zeichenketten
(Funktion)
kopiert eine Zeichenkette in eine andere
(Funktion)
(C23)
kopiert einen Puffer in einen anderen, stoppt nach dem angegebenen Trennzeichen
(Funktion)