Namensräume
Varianten
Aktionen

strcat, strcat_s

Von cppreference.com
< c‎ | string‎ | byte
Definiert in 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) Hängt eine Kopie des nullterminierten Byte-Strings, auf den src zeigt, an das Ende des nullterminierten Byte-Strings, auf den dest zeigt, an. Das Zeichen src[0] ersetzt den Nullterminator am Ende von dest. Der resultierende Byte-String ist nullterminiert.
Das Verhalten ist undefiniert, wenn das Zielarray nicht groß genug für den Inhalt von sowohl src als auch dest und das terminierende Nullzeichen ist. Das Verhalten ist undefiniert, wenn sich die Strings überlappen. Das Verhalten ist undefiniert, wenn entweder dest oder src kein Zeiger auf einen nullterminierten Byte-String ist.
2) Dasselbe wie (1), mit der Ausnahme, dass der Rest des Zielarrays (vom letzten geschriebenen Zeichen bis destsz) mit nicht spezifizierten Werten überschrieben werden kann und die folgenden Fehler zur Laufzeit erkannt und die aktuell installierte Constraint-Handler-Funktion aufgerufen wird:
  • src oder dest ist ein Nullzeiger
  • destsz ist null oder größer als RSIZE_MAX
  • Es gibt keinen Nullterminator in den ersten destsz Bytes von dest
  • Eine Trunkierung würde stattfinden (der verfügbare Platz am Ende von dest würde nicht ausreichen für jedes Zeichen, einschließlich des Nullterminators, von src)
  • Es würde eine Überschneidung zwischen der Quell- und der Zielzeichenkette auftreten
Das Verhalten ist undefiniert, wenn die Größe des Zeichenarrays, auf das dest zeigt, < strlen(dest)+strlen(src)+1 <= destsz ist; mit anderen Worten, ein fehlerhafter Wert von destsz deckt den drohenden Pufferüberlauf nicht auf.
Wie bei allen grenzgeprüften Funktionen ist strcat_s nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <string.h> auf die ganzzahlige Konstante 1 setzt.

Inhalt

[bearbeiten] Parameter

dest - Zeiger auf die nullterminierte Byte-Zeichenkette, an die angehängt werden soll
src - Zeiger auf den nullterminierten Byte-String, aus dem kopiert werden soll
destsz - maximale Anzahl von zu schreibenden Zeichen, typischerweise die Größe des Zielpuffers

[bearbeiten] Rückgabewert

1) Gibt eine Kopie von dest zurück
2) gibt null bei Erfolg zurück, gibt ungleich null bei Fehler zurück. Bei Fehler wird auch null nach dest[0] geschrieben (es sei denn, dest ist ein Nullzeiger oder destsz ist null oder größer als RSIZE_MAX).

[bearbeiten] Hinweise

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

strcat_s darf das Zielarray vom letzten geschriebenen Zeichen bis destsz überschreiben, um die Effizienz zu verbessern: Es kann in Multibyte-Blöcken kopieren und dann nach Null-Bytes suchen.

Die Funktion strcat_s ähnelt der BSD-Funktion strlcat, außer dass

  • strlcat den Quellstring trunkieren, um in das Ziel zu passen
  • strlcat nicht alle Laufzeitprüfungen durchführt, die strcat_s durchführt
  • strlcat Fehler nicht durch Setzen des Ziels auf einen Null-String oder Aufrufen eines Handlers, wenn der Aufruf fehlschlägt, offensichtlich macht.

Obwohl strcat_s Trunkierungen aufgrund potenzieller Sicherheitsrisiken verbietet, ist es möglich, einen String mit der grenzgeprüften strncat_s stattdessen zu trunkieren.

[bearbeiten] 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

[bearbeiten] 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

[bearbeiten] Siehe auch

verbindet eine bestimmte Anzahl von Zeichen von zwei Strings
(Funktion) [bearbeiten]
kopiert einen String in einen anderen
(Funktion) [bearbeiten]
kopiert einen Puffer in einen anderen und stoppt nach dem angegebenen Trennzeichen
(Funktion) [bearbeiten]
C++-Dokumentation für strcat