Other Alias
strncpyÜ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
Siehe attributes(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke.Schnittstelle | Attribut | Wert |
strcpy(), strncpy() | Multithread-Fähigkeit | MT-Safe |
KONFORM ZU
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.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';
(Die obige Technik ignoriert natürlich die Tatsache, dass falls die Quelle mehr als buflen - 1 Byte enthält, diese Informationen beim Kopieren nach Ziel verloren gehen.)
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.KOLOPHON
Diese Seite ist Teil der Veröffentlichung 4.06 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 <[email protected]>, Dr. Tobias Quathamer <[email protected]>, Helge Kreutzmann <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> 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 <[email protected]>.