Strcpy-Alternativen

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:

  • Die Funktion ist weithin verfügbar, was i.d.R. durch Standards sichergestellt ist.
  • Die Funktion nimmt die Länge des Output-Buffers entgegen, um Buffer-Overflows zu verhindern.
  • Das Ergebnis immer ein 0-terminierter String ist
  • Die Funktion lässt erkennen, ob der gesamte String kopiert wurde. Dadurch lässt sich auch das weitere Anhängen von weiteren Strings erleichtern, da nicht erneut das String-Ende gesucht werden muss.
  • Es werden im Sinne der Effizienz nur die notwendigen Bytes geschrieben.

Welche der Funktionen ist zum Kopieren eines C-Strings am besten geeignet?

Lösung
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.