Was ist der signifikante Unterschied zwischen memcpy()
und strncpy()
? Ich frage das, weil wir einfach strncpy()
ändern können, um beliebige Daten zu kopieren, nicht nur Zeichen, einfach indem wir die ersten zwei nicht char*
Argumente auf char*
und das dritte Argument als ein Vielfaches von Größe dieses Nicht-Zeichen-Typs. Im folgenden Programm habe ich das erfolgreich benutzt, um Teile eines Integer-Arrays in andere zu kopieren, und es funktioniert so gut wie memcpy()
.
Ähnlich können wir es für float
oder andere Datentypen arbeiten lassen. Also, was ist der wesentliche Unterschied zu memcpy()
?
PS: Ich frage mich auch, warum memcpy()
in string.h
header-Datei ist, da fast alle Bibliotheksfunktionen auf Zeichenketten bezogen sind, während memcpy()
generischer ist Natur. Irgendein Grund?
Der einfache Unterschied besteht darin, dass memcpy()
Daten mit eingebetteten Null-Zeichen kopieren kann (auch bekannt als String-Terminator in C-artigen Strings), während strncpy()
nur die maximale Anzahl von Zeichen oder die Zahl kopiert Position des ersten Nullzeichens (und den Rest der Strings mit 0s belegen).
Mit anderen Worten, sie haben zwei sehr unterschiedliche Anwendungsfälle.
Nehmen Sie zum Beispiel diese Zahlen in Ihrem Array:
%Vor% Das niederwertigste Byte der ersten Zahl brr[0]
ist 0
( 512
ist 0x200
), was dazu führt, dass 1) %% aufhört zu kopieren. strncpy
kopiert keine Zeichen, die einer Null folgen
Zeichen.
1) Um pedantisch zu sein (siehe Kommentare), gilt dies vorausgesetzt, dass die Implementierung strncpy
hat.
Wenn der Speicherblock kopiert werden muss, ist memcpy nützlich und die Daten in der for-Zeichenfolge strncpy sind aufgrund des natürlichen Vorteils der Zeichenfolge '\ 0' sinnvoll. Andernfalls führen beide nach der Ausführung dasselbe Kopiermuster aus.