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:
srcoderdestein Nullzeiger istdestszNull oder größer als RSIZE_MAX- in den ersten
destszBytes vondest - kein Nullterminator vorhanden ist
desteine Abschneidung stattfinden würde (der verfügbare Platz am Ende vonsrcwürde nicht für jedes Zeichen, einschließlich des Nullterminators, von - ausreichen)
eine Überschneidung zwischen der Quell- und der Zielzeichenkette auftreten würde
dest < 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.hSiehe 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, dassstrlcatdie Quellzeichenkette abschneidet, um in das Ziel zu passenstrcat_snicht alle Laufzeitprüfungen durchführt, diestrlcatdurchfü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.
Beispiel
#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
strncat_s |
(C11) verkettet eine bestimmte Anzahl von Zeichen zweier Zeichenketten |
strcpy_s |
(C11) kopiert eine Zeichenkette in eine andere |
memccpy |
(C23) kopiert einen Puffer in einen anderen und stoppt nach dem angegebenen Trennzeichen |
(Funktion)C++-Dokumentation für
| |