strcat, strcat_s
Von cppreference.com
| 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:-
srcoderdestist ein Nullzeiger -
destszist null oder größer als RSIZE_MAX - Es gibt keinen Nullterminator in den ersten
destszBytes vondest - Eine Trunkierung würde stattfinden (der verfügbare Platz am Ende von
destwürde nicht ausreichen für jedes Zeichen, einschließlich des Nullterminators, vonsrc) - 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_snur 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ück2) 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
-
strlcatden Quellstring trunkieren, um in das Ziel zu passen -
strlcatnicht alle Laufzeitprüfungen durchführt, diestrcat_sdurchführt -
strlcatFehler 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
Führen Sie diesen Code aus
#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
| (C11) |
verbindet eine bestimmte Anzahl von Zeichen von zwei Strings (Funktion) |
| (C11) |
kopiert einen String in einen anderen (Funktion) |
| (C23) |
kopiert einen Puffer in einen anderen und stoppt nach dem angegebenen Trennzeichen (Funktion) |
| C++-Dokumentation für strcat
| |