2013-05-14 7 views
8

Was ist der signifikante Unterschied zwischen memcpy() und strncpy()? Ich frage das, weil wir einfach strncpy() ändern können, um irgendeinen Typ von Daten zu kopieren, nicht nur Zeichen, einfach indem wir die ersten zwei nicht char* Argumente auf char* umwandeln und das dritte Argument als ein Vielfaches der Größe dieses Nicht-Zeichens verändern Art. Im folgenden Programm habe ich erfolgreich das verwendet, um einen Teil eines Integer-Arrays in ein anderes zu kopieren, und es funktioniert so gut wie memcpy().Was ist der Unterschied zwischen memcpy() und strncpy(), letzteres kann leicht ein Ersatz für den ersten sein?

#include <stdio.h> 
    #include <string.h> 


    int main() 
    { 
    int arr[2]={20,30},brr[2]={33,44}; 
    //memcpy(arr,brr,sizeof(int)*1); 
    strncpy((char*)arr,(char*)brr,sizeof(int)*1); 
    printf("%d,%d",arr[0],arr[1]); 

    } 

In ähnlicher Weise können wir es für float oder anderen Datentyp zu arbeiten. Was ist der wesentliche Unterschied zu memcpy()?

PS: Außerdem frage ich mich, warum memcpy() in string.h Header-Datei ist, da fast alle Bibliotheksfunktionen gegeben sind Zeichenketten zusammen, während memcpy() allgemeinerer Natur ist. Irgendein Grund?

+0

Ich googelte dafür, aber die einzige Frage, die es ähnelt, ist http://stackoverflow.com/questions/4593907/difference-between-strncpy-and-memcpy, aber es beantwortet nicht, was ich hier zu fragen beabsichtige . – Thokchom

+0

memcopy kopiert unbedingt, bis es fertig ist, aber viele Bytes, die Sie wollten. strncpy kopiert so lange, bis ein NULL-Wert (string terminator) erreicht wird oder "n" Bytes kopiert werden. Daher können Sie strncpy nicht für beliebige Binärdaten verwenden, da solche Daten natürlicherweise Nullwerte enthalten können. –

+0

[Verwandte Frage] (http://stackoverflow.com/questions/6509449/is-strncpy-a-specialization-of-memcpy). – Dukeling

Antwort

17

Der einfache Unterschied ist, dass memcpy() Daten mit eingebetteten Nullzeichen kopieren kann (aka der String-Terminator in C-Stil-Strings), während strncpy() nur die Zeichenfolge auf das Maximum der Anzahl der Zeichen oder die Position der erstes Nullzeichen (und passe den Rest der Strings mit 0s an).

Mit anderen Worten, sie haben zwei sehr unterschiedliche Anwendungsfälle.

+0

Padding mit 0 oder '0'? Ich meine NULL oder das Zeichen '0'? – Thokchom

+0

Laut diesem Link (http://www.cplusplus.com/reference/cstring/strncpy) sind es Nullen. –

+0

Zeichen 0 (wie in 0x0, nicht '0') ist das Nullzeichen. 'strncpy()' pads mit dem Zeichen 0 (d. h. Nullzeichen). – nebain

5

Nehmen Sie zum Beispiel diese Zahlen im Array:

brr[2]={512,44}; 

Das niederwertige Byte der ersten Zahl brr[0] ist 0 (512 ist 0x200), die würde 1)strncpy führt den Kopiervorgang zu stoppen. strncpy kopiert keine Zeichen, die einem Nullzeichen folgen.

1) Um pedantisch zu sein (siehe Kommentare), gilt dies vorausgesetzt, dass die Implementierung sizeof (int) > 1 hat.

+0

Was ist, wenn "int" 16 Bit lang und in Big-Endian-Reihenfolge gespeichert ist? –

+0

Gleiches. Das Nullzeichen (obwohl es sich an einem anderen Ort befindet) stoppt die Kopie "strncpy". – ouah

+0

@KerrekSB Wenn eine Person Ihres Rufes ** eine Frage stellt, wird man sie wahrscheinlich als Sarkasmus betrachten ... aber dann ** ouah ** ist auch kein kleiner Fisch ... – Thokchom

0

Wenn der Speicherblock kopiert werden muss, ist memcpy nützlich, und die Daten in der for-Zeichenfolge strncpy sind wegen des natürlichen Vorteils der Zeichenfolge '\ 0' sinnvoll. Ansonsten führen beide nach der Ausführung dasselbe Kopiermuster aus.

Verwandte Themen