STRCPY(3)

BEZEICHNUNG
strcpy, strncpy - kopiert eine Zeichenkette

ÜBERSICHT
#include <string.h>

char *strcpy(char *Ziel, const char *Quelle);

char *strncpy(char *Ziel, const char *Quelle, size_t n);

BESCHREIBUNG
Die Funktion strcpy() kopiert die Zeichenkette, auf die der Zeiger Quelle zeigt, inklusive des abschließenden Null-Bytes ('\0') an die Stelle, auf die Ziel zeigt. Die Zeichenketten dürfen sich nicht überlappen und die Zielzeichenkette Ziel muss groß genug sein, um die Kopie aufzunehmen. Vorsicht vor Pufferüberläufen! (Siehe FEHLER)

Die Funktion strncpy() arbeitet ähnlich, allerdings werden maximal n Byte von Quelle kopiert. Warnung: Ist kein Null-Byte innerhalb der ersten n Byte von Quelle, wird die Zeichenkette in Ziel nicht durch ein Null-Byte abgeschlossen.

Ist die Länge von Quelle kleiner als n, schreibt strncpy() zusätzliche Null-Bytes nach Ziel, um sicherzustellen, dass insgesamt n Byte geschrieben werden.

Eine einfache Implementierung von strncpy() ist:
char *
strncpy(char *Ziel, const char *Quelle, size_t n)
{
    size_t i;
    for (i = 0; i < n && Quelle[i] != '\0'; i++)
        Ziel[i] = Quelle[i];
    for ( ; i < n; i++)
        Ziel[i] = '\0';
    return Ziel;
}

RÜCKGABEWERT
Die Funktionen strcpy() und strncpy() geben einen Zeiger auf die Zielzeichenkette Ziel zurück.

ATTRIBUTE

  Multithreading (siehe pthreads(7))
Die Funktionen strcpy() und strncpy() sind multithread-fähig.

KONFORM ZU
SVr4, 4.3BSD, C89, C99.

ANMERKUNGEN
Einige Programmierer halten strncpy() für ineffizient und fehleranfällig. Wenn der Programmierer weiß, dass die Größe von Ziel größer ist als die Länge von Quelle (indem er Code verwendet, der das überprüft!), kann strcpy() benutzt werden. Eine gültige (und beabsichtigte) Anwendung von strncpy() ist es, eine C-Zeichenkette in einen Puffer fester Länge zu kopieren und zugleich zweierlei zu garantieren: der Puffer läuft nicht über und nicht benutzte Bytes im Zielpuffer werden auf Null gesetzt. (Vielleicht um Informationslecks zu verhindern, wenn der Puffer auf Medien geschrieben oder mittels einer IPC-Technik (Interprozesskommunikation) zu einem anderen Prozess übertragen werden soll.) Wenn kein abschließendes Null-Byte innerhalb der ersten n Bytes von Quelle enthalten ist, erstellt strncpy() eine nicht abgeschlossene Zeichenkette in Ziel. Falls buf die Länge buflen hat, können Sie den Abschluss durch etwas wie das Folgende erzwingen:
strncpy(buf, str, buflen - 1);
if (buflen > 0)
    buf[buflen - 1]= '\0';

(Of course, the above technique ignores the fact that, if src contains more than buflen - 1 bytes, information is lost in the copying to dest.)

  strlcpy()
Einige Systeme (die BSDs, Solaris und andere) stellen die folgende Funktion bereit:
    size_t strlcpy(char *ziel, const char *quelle, size_t groesse); Diese Funktion ähnelt strncpy(), aber sie kopiert höchstens groesse-1 Byte zum ziel, fügt immer ein abschließendes Null-Byte hinzu und füllt das Ziel nicht mit (weiteren) Null-Bytes auf. Diese Funktion behebt einige der Probleme von strcpy() und strncpy(), aber der Aufrufende muss sich mit der Möglichkeit von Datenverlust befassen, wenn groesse zu klein ist. Der Rückgabewert der Funktion ist die Länge der quelle, mit der die Verkürzung leicht erkannt werden kann: wenn der Rückgabewert größer als oder gleich der groesse ist, wurde verkürzt. Wenn Datenverlust nicht auftreten darf, muss der Aufrufende entweder die Argumente vor dem Aufruf oder den Rückgabewert der Funktion prüfen. strlcpy() ist nicht in der Glibc vorhanden und nicht von POSIX standardisiert, sondern ist unter Linux über die Bibliothek libbsd verfügbar.

FEHLER
Wenn die Zielzeichenkette beim Aufruf von strcpy() nicht groß genug ist, kann alles Denkbare passieren. Der Überlauf von Zeichenkettenpuffern mit fester Länge ist eine beliebte Cracker-Technik, um vollständige Kontrolle über einen Rechner zu erlangen. Immer, wenn ein Programm Daten aus einem Puffer liest oder in ihn schreibt, muss das Programm zuerst überprüfen, ob es genug freien Platz gibt. Das kann überflüssig sein, wenn Sie beweisen können, dass ein Überlauf unmöglich ist, aber seien Sie vorsichtig: Programme können im Lauf der Zeit geändert werden. Und plötzlich wird das Unmögliche möglich.

SIEHE AUCH
bcopy(3), memccpy(3), memcpy(3), memmove(3), stpcpy(3), stpncpy(3), strdup(3), string(3), wcscpy(3), wcsncpy(3)

KOLOPHON
This page is part of release 3.70 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Markus Schmitt <fw@math.uni-sb.de>, Tobias Quathamer <toddy@debian.org>, Helge Kreutzmann <debian@helgefjell.de> und Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> 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 <debian-l10n-german@lists.debian.org>.