strncpy oder strlcpy in meinem Fall
was sollte ich verwenden, wenn ich kopieren will src_str
zu dst_arr
- und warum?
char dst_arr[10];
char *src_str = "hello";
PS: mein Kopf dreht sich schneller als die Festplatte meines Computers nach der Lektüre eine Menge der Dinge, wie gute oder bad ist strncpy
und strlcpy
.
Anmerkung: ich weiß strlcpy
ist nicht überall verfügbar. Das ist nicht das Anliegen hier.
InformationsquelleAutor hari | 2011-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
strncpy
ist nie die richtige Antwort, wenn Ihr Ziel-string ist null-terminiert.strncpy
ist eine Funktion, die verwendet werden soll, mit nicht-beendet fester Breite strings. Genauer gesagt, dessen Zweck es ist, zu konvertieren, eine null-terminierte Zeichenfolge auf eine nicht terminierte Feste-Breite-string (durch kopieren). In anderen Worten,strncpy
ist nicht sinnvoll anwendbar hier.Die echte Wahl haben Sie hier zwischen
strlcpy
und plainstrcpy
.Wenn Sie möchten, führen Sie "sicher" (d.h. potentiell abgeschnitten) kopieren zu
dst_arr
ist, die richtige Funktion zu verwenden, iststrlcpy
.Als für
dst_ptr
... Es gibt keine solche Sache wie "kopieren in diedst_ptr
". Sie können kopieren, zu Speicher zeigtedst_ptr
, aber zuerst müssen Sie sicherstellen, dass es Punkte irgendwo und weisen, dass der Speicher. Es gibt viele verschiedene Möglichkeiten, es zu tun.Zum Beispiel, können Sie nur
dst_ptr
zeigendst_arr
, in welchem Fall die Antwort ist die gleiche wie im vorherigen Fall -strlcpy
.Oder Sie können den Speicher mit
malloc
. Wenn die Speichermenge, die Sie zugeteilt ist garantiert genug für die Zeichenfolge (D. H. mindestensstrlen(src_str) + 1
bytes zugewiesen wird), dann können Sie die Ebenestrcpy
oder sogarmemcpy
kopieren Sie die Zeichenfolge. Es gibt keine Notwendigkeit und keinen Grund für die Verwendungstrlcpy
in diesem Fall , obwohl einige Leute könnten es vorziehen, es zu benutzen, da es irgendwie gibt Ihnen das Gefühl der zusätzlichen Sicherheit.Wenn du absichtlich weniger Speicher zuweisen (d.h. Sie wollen Ihren string abgeschnitten), dann
strlcpy
wird die richtige Funktion zu verwenden.Die Ziel-string.
strncpy
ist ein Konvertierung - Funktion konvertiert null-terminierte Zeichenkette an einer nicht-beendeten mit fester Breite Ziel-string.Also, Wenn mein Ziel-string ist
char dst_arr[10];
ist nicht null-terminiert ist. Dann sollte ich verwendenstrlcpy
richtig?Ähm... ich verstehe nicht die Frage. Es spielt keine Rolle was Ihre
dst_arr
ist ursprünglich. Ursprünglich ist es nur ein block von raw nicht initialisierten Speicher. Die Frage ist, was Sie wollen, tun, schaffen, dassdst_arr
. Ich vermutete, dass Sie möchten, erstellen Sie ein standard-gewöhnliche null-terminierten string indst_arr
(da Sie sagte, dass Sie wollte, kopieren eine gewöhnliche null-terminated string). Wenn dem so ist, verwenden Siestrlcpy
. Wenn Sie stattdessen möchten, erstellen Sie eine "Feste Breite "string" indst_arr
(das ist eher ungewöhnlich, da die meisten der Zeit, die niemand jemals verwendet eine Feste Breite Zeichenfolgen in diesen Tagen), Nutzungstrncpy
.Mein schlechtes. Ich möchte die standard-gewöhnliche null-terminierten string. Vielen Dank für Eure Hilfe.
InformationsquelleAutor AnT
strlcpy()
ist sicherer alsstrncpy()
so dass Sie könnte genauso gut verwenden.Systeme, die es nicht haben, haben oft ein
s_strncpy()
dass nicht die gleiche Sache.Hinweis : man kann nicht alles kopieren, zu
dst_ptr
bis es deutet auf etwasInformationsquelleAutor Martin Beckett
Wusste ich nicht von strlcpy. Ich habe gerade festgestellt,hier:
So strlcpy Nähte sicherer.
Bearbeiten: Eine vollständige Erörterung zur Verfügung hier.
Edit2:
Merke ich, dass was ich oben geschrieben habe keine Antwort auf die "in Ihrem Fall" - Teil deiner Frage. Wenn Sie verstehen die Grenzen von strncpy, ich denke, Sie können es verwenden, und guten code zu schreiben um es zu vermeiden, seine Tücken; aber wenn Sie nicht sicher sind, über Ihr Verständnis von Grenzen, Nutzung strlcpy.
Mein Verständnis, die Grenzen der strncpy-und strlcpy ist, dass man etwas tun kann, sehr schlecht mit strncpy (buffer overflow), und das Schlimmste Sie tun können, mit strlcpy ist Locker einen char in den Prozess.
strlcpy
? können Sie bitte erklären?Wenn Sie strncpy-Kopie einer Zeichenkette größer als der Puffer, es wird nicht ein
'\0'
am Ende des Puffers. Wenn Sie strlcpy, die'\0'
wird da sein, aber ein kleiner char wird in den Puffer. Also, wenn jemand strncpy verwendet, wenn er benutzt memcpy, mit strlcpy statt strncpy verlieren ihn nur ein char.Danke. Also, wenn die Verwendung
strlcpy
einzige Sache, die Sie brauchen zu kümmern ist, sollten Sie dem Ziel mit (src_length + 1 für die null). Richtig?Nicht genau. Die sehr wichtige Sache zu geben, ist bei den meisten Sommerzeit Größe in der 3. argument zum vermeiden von buffer-overflow. Von dort aus, wenn das 3. argument ist mindestens
src_length + 1
kein char verloren in der Kopie. Vielleicht möchten Sie den src abgeschnitten werden, und dies wird geschehen, wenn das 3. argument ist weniger alssrc_length + 1
. Aber seien Sie vorsichtig, zu kürzen str 5 chars, das 3. argument sollte 6 sein, und dst-Größe muss mindestens 6 zum vermeiden von buffer-overflow.Nein, das ist falsch. Der Punkt, der
strlcpy
ist, um zu vermeiden, überlauf des ausgabepuffers. Das bedeutet, dass diesize
argument ist die Größe des Ziel - Puffer, nicht die Quelle-Puffer - ... genau, es ist die Menge an Speicherplatz in den Ziel-Puffer. Wenn Sie "bieten src_length + 1 all the time", Ihr code wird gespickt mit buffer-overflow-Fehler.InformationsquelleAutor jfg956
Sollten Sie immer die standard-Funktion, die in diesem Fall ist der C11
strcpy_s()
Funktion. Nichtstrncpy()
, da dies unsicher ist keine Garantie für null-Terminierung. Und nicht die OpenBSD-nurstrlcpy()
, wie es ist auch unsicher, und OpenBSD kommt immer mit seinen eigenen Erfindungen, die in der Regel nicht machen es in jedem standard.Sehen
http://en.cppreference.com/w/c/string/byte/strcpy
Die Funktion strcpy_s ist ähnlich der BSD-Funktion strlcpy, außer dass
strlcpy kürzt die Zeichenkette passt nicht in das Ziel (das ist ein Sicherheitsrisiko)
Wenn Ihre C-Bibliothek nicht
strcpy_s
verwenden Sie die safec lib.https://rurban.github.io/safeclib/doc/safec-3.1/df/d8e/strcpy__s_8c.html
InformationsquelleAutor rurban
Zuerst, Ihre dst_ptr kein Platz zugewiesen, und Sie haben nicht, es zu zeigen, um die anderen, also die Zuordnung etwas, würde wahrscheinlich dazu führen, dass ein segmentation fault.
Strncpy sollte funktionieren einwandfrei - nur:
und Sie wissen, dass Sie nicht überlaufen dst_arr. Wenn Sie eine größere src_str, die Sie haben könnten, um Ihre eigenen null-terminator am Ende der dst_arr, aber in diesem Fall ist Ihre Quelle und < Ihr Ziel, so wird es aufgefüllt mit Nullen sowieso.
Diese überall funktioniert und sichere, so dass ich nicht sehen würde auf irgendetwas anderes, es sei denn, seine Intellektuelle Neugier.
Beachten Sie auch, dass es gut wäre, eine nicht-Magische Zahl für die 10, so werden Sie wissen, die Größe entspricht der Größe des strncpy 🙂
strncpy
ist fast nie der richtige, da es null-füllt, aber nicht null-kündigen. Der OP willstrlcpy
, die null-beendet ist und nicht null-Füllung. Auch ist es ein Irrtum zu sprechen "in diesem Fall", denn die Frage ist natürlich nur eine illustration ... echte code ist nicht zu kopieren eine Feste Zeichenfolge wie "Hallo" zu einer festen Größe Puffer bekannt zu werden, größer.InformationsquelleAutor John Humphreys - w00te
sollten Sie nicht verwenden, strncpy und nicht strlcpy. Besser Sie verwenden
oder ohne Initialisierung
dst_arr hier muss ein array ist KEIN Zeiger.
strlcpy
kann verwendet werden, für die OP braucht.InformationsquelleAutor user411313