Vergleichen Sie die Funktionen strcpy
, strncpy
, stpcpy
, stpncpy
, strlcpy
und memccpy
, welche alle geeignet sind, um einen C-String zu kopieren. Ziehen Sie dazu auch die jeweiligen Man-Pages heran. Achten Sie insbesondere auf folgende Aspekte:
0
-terminierter String istWelche der Funktionen ist zum Kopieren eines C-Strings am besten geeignet?
Kriterium | strcpy |
strncpy |
stpcpy |
stpncpy |
strlcpy |
memccpy |
---|---|---|---|---|---|---|
Standardisiert? | C | C | POSIX | POSIX | — (BSD) | POSIX/C23 |
Buffer-Länge spezifizierbar? | — | Ja | — | Ja | Ja | Ja |
Schreibt immer NUL-Byte? | Ja | — | Ja | — | Ja | — |
Rückgabe von String-Ende? | — | — | Ja | Ja | Ja | Ja |
Schreibt nur notwendige Bytes? | Ja | — | Ja | — | Ja | Ja |
strcpy
/stpcpy
kopieren den String bis zum Null-Terminal; strcpy
gibt einen Pointer auf den Anfang des kopierten Strings zurück, stpcpy
einen Pointer auf dessen Ende (0
-Byte).strncpy
/stpncpy
erstellen eine “null-padded character sequence” und sind nicht zum Kopieren von Strings vorgesehen. Der gesamte Speicherbereich wird zuerst mit 0 überschrieben, bevor maximal n
Zeichen kopiert werden, bei einer Truncation geht das String-Terminal verloren. (Man beachte bei der Funktionsfamilie strn
, insbesondere strncat
, dass sich n
auf die Länge der Quelle bezieht, nicht des Ziels.)strlcpy
kopiert den String, ggf. limitiert auf die Buffergröße des Ziels. Das Ergebnis ist immer 0
-terminiert. Rückgabe ist die Länge des Eingabestrings, eine Truncation lässt sich durch einen Vergleich mit der Buffergröße erkennen.Die Funktion strlcpy
ist zwar funktional am besten geeignet, aber außerhalb von BSD-Derivaten nicht sehr weit verbreitet und daher derzeit nicht standardisiert. Die Funktion memccpy
stellt eine gute Alternative dar und ist zudem zur Aufnahme in den C23-Standard vorgesehen.