strcat, strcat_s
|
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) |
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.
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.
destsz
) mit unspezifizierten Werten überschreiben kann und dass die folgenden Fehler zur Laufzeit erkannt werden und den aktuell installierten
constraint handler
aufrufen:
-
-
srcoderdestist ein null pointer -
destszist null oder größer als RSIZE_MAX -
es gibt keinen null terminator in den ersten
destszBytes vondest -
truncation würde auftreten (der verfügbare Platz am Ende von
destwürde nicht jedes Zeichen, einschließlich des null terminators, vonsrcaufnehmen) - overlap würde zwischen den Quell- und Zielzeichenfolgen auftreten
-
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_snur 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
dest
zurück
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
-
strlcatkürzt den Quellstring, damit er in das Ziel passt -
strlcatführt nicht alle Laufzeitprüfungen durch, diestrcat_sdurchführt -
strlcatmacht 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
|
(C11)
|
verkettet eine bestimmte Anzahl von Zeichen zweier Zeichenketten
(Funktion) |
|
(C11)
|
kopiert eine Zeichenkette in eine andere
(Funktion) |
|
(C23)
|
kopiert einen Puffer in einen anderen, stoppt nach dem angegebenen Trennzeichen
(Funktion) |
|
C++-Dokumentation
für
strcat
|
|