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.