Ich würde vorschlagen, strdup() jemals zu verwenden. Und malloc() + memcpy() nur mit großen Strings, wo Sie die tatsächliche Größe kennen. Dadurch können Sie die Zeit speichern, um die Zeichenfolge zu erhalten, um die Länge zu erhalten. Da dies eine sehr schnelle Funktion ist, können Sie den Unterschied nur bis zu mehreren Megabyte Text schätzen. Lassen nehme an, Sie eine Struktur Zeichenfolge
typedef struct string
{
char* st;
long buf;
long n;
} String;
In diesem Fall haben Sie jemals zur Verfügung haben, die tatsächliche Größe der Zeichenfolge, also wenn ich strdup sollte() diese Zeichenfolge ich schreiben würde:
char * stringdup(String *st)
{
char *res=malloc(st->n);
res?memcpy(res,st->st,st->n):NULL;
}
Sie kann etwas bemerken: Wenn ich die Zeichenfolge dupliziere, gebe ich ein Zeichen * und keine Zeichenfolge zurück. Erfahrung sagt, dass die Struct-Zeichenkette, nur zum Erstellen von Zeichenketten verwendet werden kann, aber zum Speichern von Zeichenketten nicht komfortabel ist. Weil alle Debugger ein char * als String anzeigen können, aber niemand Ihre Struktur kennt. Sobald Sie Ihre letzte Zeichenfolge definiert haben, verlassen Sie besser die Struktur. Sie sparen Platz und das Debugging wird schneller. Dies ist auch der Grund dafür, dass sich für kleine Texte, solche Anleitungen nicht lohnt. Sie werden es nie zu schätzen wissen, aber es wird Ihren Code durcheinander bringen.
UPDATE:
Ich vergaß eine andere Situation. Sie können malloc() + memcpy() verwenden, wenn Sie nur eine Teilmenge Ihrer Zeichenfolge kopieren müssen. strdup() und strcpy() kopieren alles. Aber wenn Sie nur einen Teil Ihres Textes möchten, sollten Sie diese Anweisungen verwenden.
strdup wahrscheinlich vermeidet die Notwendigkeit, die Länge der Zeichenfolge zweimal zu finden, und es ist anschaulicher, wenn ich es im Code sehe. Wirklich Meinung basiert aber. –
Es gibt keinen großen Unterschied, wenn Sie reines C verwenden, aber es gibt einige Frameworks, die die Straddup tatsächlich neu definiert haben, z. PHP Zend –
'strdup' ist nicht Teil von ISO C –