Scroll to navigation

STRCAT(3) Linux-Programmierhandbuch STRCAT(3)

BEZEICHNUNG

strcat, strncat - hängt zwei Zeichenketten aneinander

ÜBERSICHT

#include <string.h>
char *strcat(char *Ziel, const char *Quelle);
char *strncat(char *Ziel, const char *Quelle, size_t n);

BESCHREIBUNG

Die Funktion strcat() hängt die Zeichenkette Quelle an die Zeichenkette Ziel an, überschreibt dabei das Nullbyte (»\0«) am Ende von Ziel und fügt ein neues abschließendes Nullbyte an. Die Zeichenketten dürfen nicht überlappen und Ziel muss genügend Platz für das Ergebnis haben. Falls Ziel nicht groß genug ist, ist das Programmverhalten unvorhersehbar; Pufferüberläufe sind ein beliebter Angriffspfad für sichere Programme.

Die Funktion strncat() ist ähnlich, aber sie

  • bearbeitet höchstens n Bytes von Quelle; und
  • Quelle muss nicht mit einem Nullbyte abgeschlossen sein, falls es n oder mehr Bytes enthält.

Wie auch bei strcat() endet die resultierende Zeichenkette in Ziel mit einem Nullbyte.

Wenn Quelle n oder mehr Bytes enthält, schreibt strncat() n+1 Bytes nach Ziel (n von Quelle sowie das abschließende Nullbyte). Daher muss die Größe von Ziel wenigstens strlen(Ziel)+n+1 Zeichen sein.

Eine einfache Implementierung von strncat() könnte so aussehen:


char *
strncat(char *Ziel, const char *Quelle, size_t n)
{

size_t Ziel_len = strlen(Ziel);
size_t i;
for (i = 0 ; i < n && Quelle[i] != '\0' ; i++)
Ziel[Ziel_len + i] = Quelle[i];
Ziel[Ziel_len + i] = '\0';
return Ziel; }

RÜCKGABEWERT

Die Funktionen strcat() und strncat() geben einen Zeiger auf die resultierende Zeichenkette Ziel zurück.

ATTRIBUTE

Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.

Schnittstelle Attribut Wert
strcat(), strncat() Multithread-Fähigkeit MT-Safe

KONFORM ZU

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

ANMERKUNGEN

Einige Systeme (die BSDs, Solaris und andere) stellen die folgende Funktion bereit:


size_t strlcat(char *dest, const char *src, size_t size);

Diese Funktion fügt die null-terminierte Zeichenkette Quelle an die Zeichenkette Ziel an, kopiert dabei höchstens Größe-strlen(Ziel)-1 Zeichen von Quelle und fügt dem Ergebnis ein Nullbyte an, wenn nicht Größe kleiner als strlen(Ziel) ist. Diese Funktion behebt das Pufferüberlauf-Problem von strcat(), aber der Aufrufende muss sich noch mit der Möglichkeit eines Datenverlusts befassen, wenn Größe zu klein ist. Die Funktion gibt die Länge der Zeichenkette zurück, die strlcat() zu erzeugen versuchte; wenn der Rückgabewert größer als oder gleich Größe ist, kam es zu Datenverlust. Wenn Datenverlust von Bedeutung ist, muss der Aufrufende entweder vor dem Aufruf die Argumente oder nach dem Aufruf den Rückgabewert prüfen. strlcat() ist nicht in Glibc vorhanden und nicht von POSIX standardisiert, sondern ist unter Linux über die Bibliothek libbsd verfügbar.

BEISPIELE

strcat() und strncat() müssen das Nullbyte finden, das die Zeichenkette Ziel abschließt. Hierfür wird eine Suche benutzt, die am Anfang der Zeichenkette beginnt. Aus diesem Grund skaliert die Ausführungszeit dieser Funktionen mit der Länge der Zeichenkette Ziel. Dies kann durch die Ausführung des unten stehenden Programms gezeigt werden. (Wenn viele Zeichenketten zu einer Zeichenkette zusammengefasst werden sollen, dann ist die Ausführung schneller, wenn die Bytes von jeder Quell-Zeichenkette »manuell« in die Ziel-Zeichenkette kopiert werden, während ein Zeiger auf das jeweils aktuelle Ende der Ziel-Zeichenkette zeigt.)

Programmquelltext

#include <stdint.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
#define LIM 4000000

char p[LIM + 1]; /* +1 für abschließendes Nullbyte */
time_t base;
base = time(NULL);
p[0] = '\0';
for (int j = 0; j < LIM; j++) {
if ((j % 10000) == 0)
printf("%d %jd\n", j, (intmax_t) (time(NULL) - base));
strcat(p, "a");
} }

SIEHE AUCH

bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(3)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können, sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Markus Schmitt <fw@math.uni-sb.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.

1. November 2020 GNU