Warum sollten Sie strncpy anstelle von strcpy verwenden?
Edit: ich habe die Quelle für das Beispiel.
Stieß ich auf dieses Beispiel:
char source[MAX] = "123456789";
char source1[MAX] = "123456789";
char destination[MAX] = "abcdefg";
char destination1[MAX] = "abcdefg";
char *return_string;
int index = 5;
/* This is how strcpy works */
printf("destination is originally = '%s'\n", destination);
return_string = strcpy(destination, source);
printf("after strcpy, dest becomes '%s'\n\n", destination);
/* This is how strncpy works */
printf( "destination1 is originally = '%s'\n", destination1 );
return_string = strncpy( destination1, source1, index );
printf( "After strncpy, destination1 becomes '%s'\n", destination1 );
Erzeugt diese Ausgabe:
Ziel ist ursprünglich = 'abcdefg' Nach strcpy, Ziel wird '123456789' destination1 ist ursprünglich = 'abcdefg' Nach strncpy, destination1 wird '12345fg'
Das macht mich Frage mich, warum jemand wollen würde diesen Effekt. Es sieht aus wie es wäre verwirrend. Dieses Programm macht mich denken, Sie könnten im Grunde Kopie über den Namen einer Person (zB. Tom Brokaw) mit Tom Bro763.
Was sind die Vorteile der Verwendung von strncpy()
über strcpy()
?
InformationsquelleAutor der Frage Kredns | 2009-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
strncpy
bekämpft Puffer-überlauf, der durch die Auflage, dass Sie um eine Länge.strcpy
hängt von einer trailing\0
die nicht immer auftreten.Zweitens, warum Sie wählte, um nur kopieren 5 Zeichen auf 7-Zeichen-string ist mir schleierhaft, aber es ist die Herstellung Verhalten zu erwarten. Es ist nur die Kopie über die erste
n
Zeichen, won
ist das Dritte argument.Den
n
Funktionen sind alle als defensive Codierung gegen buffer overflows. Bitte verwenden Sie anstelle älterer Funktionen, wiestrcpy
.InformationsquelleAutor der Antwort Eric
Den
strncpy()
Funktion wurde entwickelt, mit einem sehr speziellen problem in den Sinn: die Manipulation von strings gespeichert, die in der Weise der ursprünglichen UNIX-Verzeichnis-Einträge. Diese verwendet einer festen Größe array, und ein nul-terminator wurde nur benutzt, wenn der Dateiname kürzer als das array.Ist das, was hinter den zwei Merkwürdigkeiten
strncpy()
:Für eine "sicherere
strcpy()
", sind Sie besser dran mitstrncat()
etwa so:Immer nul-beenden das Ergebnis, und nicht die Kopie, die mehr als notwendig.
InformationsquelleAutor der Antwort caf
Obwohl ich weiß, die Absicht hinter
strncpy
es ist nicht wirklich eine gute Funktion. Vermeiden Sie beide. Raymond Chen erklärt.Siehe auch Warum ist strncpy unsicher?
InformationsquelleAutor der Antwort Sinan Ünür
strncpy ist NICHT sicherer als strcpy, nur trades, die eine Art von Fehler mit einem anderen. In C bei der Bearbeitung von C-strings, die Sie benötigen, zu wissen, die Größe der Puffer, es gibt keine Möglichkeit um ihn herum. strncpy gerechtfertigt war, für das Verzeichnis, was von anderen erwähnt, aber ansonsten sollte man nie verwenden:
InformationsquelleAutor der Antwort David Cournapeau
Was du suchst ist die Funktion
strlcpy()
die nicht kündigen immer der string mit 0 und initialisiert den Puffer. Es ist auch in der Lage zu erkennen überläuft. Nur das problem ist, es ist nicht (wirklich) tragbaren und ist derzeit nur auf einigen Systemen (BSD, Solaris). Das problem bei dieser Funktion ist, dass es öffnet sich ein weiteres kann von Würmern, wie sich an den Diskussionen aufhttp://en.wikipedia.org/wiki/Strlcpy
Meine persönliche Meinung ist, dass es weit mehr nützlich, als
strncpy()
undstrcpy()
. Es hat bessere Leistung und ist ein guter Begleiter zusnprintf()
. Für Plattformen, die es nicht haben, ist es relativ einfach zu implementieren.(für die Entwicklungsphase einer Anwendung, die ich ersetzen Sie diese Funktion zwei (
snprintf()
undstrlcpy()
) mit einem trapping-version, die bricht Brutal das Programm auf buffer overflows oder Kürzungen. Dies ermöglicht es zu fangen schnell die schlimmsten. Vor allem, wenn Sie arbeiten auf einer Codebasis, die von jemand anderem.EDIT:
strlcpy()
einfach umgesetzt werden können:InformationsquelleAutor der Antwort Patrick Schlüter
Den
strncpy()
Funktion ist die sicherere eins: Sie müssen übergeben Sie die maximale Länge in den Zielpuffer akzeptieren kann. Sonst könnte es passieren, dass die Quell-Zeichenfolge ist nicht korrekt 0 beendet, in welchem Fall diestrcpy()
- Funktion könnte mehr schreiben, Zeichen, Ziel, verdirbt alles, was in der Erinnerung nach dem Ziel-Puffer. Dies ist der buffer-overrun problem in vielen exploitsAuch für POSIX-API-Funktionen wie
read()
die nicht die terminierende 0 in den Puffer, sondern gibt die Anzahl der bytes, die gelesen wurden, werden Sie entweder manuell die 0, oder kopieren Sie Sie mitstrncpy()
.In deinem Beispiel-code
index
ist eigentlich kein index, sondern eincount
- es erzählt, wie viele Zeichen bei den meisten kopieren von der Quelle zum Ziel. Wenn es kein null-byte unter den ersten n Byte von Quelle, die Zeichenfolge platziert im Ziel nicht null-terminiertInformationsquelleAutor der Antwort CsTamas
strncpy füllt das Ziel mit '\0' für die Größe der Quelle, auch wenn die Größe des Ziels ist kleiner....
manpage:
InformationsquelleAutor der Antwort Jeronimo
Dies kann verwendet werden, in vielen anderen Szenarien, wo Sie brauchen, um zu kopieren, nur ein Teil der ursprünglichen Zeichenfolge an das Ziel. Mit strncpy() kopieren Sie einen begrenzten Teil der ursprünglichen Zeichenfolge als Gegensatz von strcpy(). Ich sehe den code, den Sie haben kommt von publib.boulder.ibm.com.
InformationsquelleAutor der Antwort ARV
Das hängt davon ab, auf unsere Anforderung.
Für windows-Benutzer
Strncpy verwenden wir, wenn wir nicht wollen, kopieren Sie die gesamte Zeichenfolge oder wir kopieren wollen, nur n Anzahl von Zeichen. Aber strcpy kopiert die gesamte Zeichenfolge, einschließlich des abschließenden null-Zeichens.
Diese links werden Ihnen helfen, mehr zu wissen über strcpy und strncpy
und, wo wir können.
über strcpy
über strncpy
InformationsquelleAutor der Antwort Prakash
den strncpy ist eine sicherere version von strcpy als eine Angelegenheit von der Tat, sollten Sie nie verwenden, strcpy, weil seine potentiellen buffer-overflow-Schwachstelle, die macht Ihr system anfällig für alle Art von Angriffen
InformationsquelleAutor der Antwort bashmohandes