2016-12-11 18 views
1

Ich würde gerne wissen, ob es einen Unterschied zwischen char* test = "test" und strcpy(test, "test") gibt, und wenn es einen gibt, was ist dieser Unterschied.Was ist der Unterschied zwischen strcpy und "="?

Danke.

+0

Ja, es gibt. 'strcpy' überschreibt den Speicherort im Speicher, der die Zeichenfolge speichert,' test = "string" 'ändert kaum, worauf" test "verweist. – saeleko

+3

Sie finden [diese Frage] (https://stackoverflow.com/questions/6901090/c-why-is-strcpy-necessary) interessant. – WhozCraig

+0

@WhozCraig - Die Antwort auf diese Frage scheint diese perfekt zu beantworten. Warum nicht als dup markieren? – StoryTeller

Antwort

1

Die strcpy Funktion (! , die Sie nie benutzen sollten - verwenden strncpy oder strdup Pufferüberlauf-Schwachstellen zu vermeiden), kopiert die Bytes aus einem String-Puffer auf der anderen Seite; Zuweisung ändert den Puffer, auf den Sie zeigen. Beachten Sie, dass zum Aufruf von strncpy (oder strcpy, aber nicht!) Ein Puffer bereits zugewiesen sein muss, um diese Kopie zu erstellen. Wenn Sie eine Zuweisung aus einer Literalzeichenfolge ausführen, hat der Compiler effektiv einen schreibgeschützten Puffer erstellt und Ihr Zeiger wird mit der Adresse von dem aktualisiert.

UPDATE

Wie bereits in den Kommentaren aus, Strncpy seine Nachteile hat, auch. Sie sind viel besser dran mit Ihren eigenen Hilfsfunktionen, um die Daten von einem Puffer zu einem anderen zu kopieren. Zum Beispiel:

ReturnCode CopyString(char* src, char* out, int outlen) { 
    if (!src) { 
    return NULL_INPUT; 
    } 
    if (!out) { 
    return NULL_OUTPUT; 
    } 
    int out_index = 0; 
    while ((*src != '\0') && (out_index < outlen - 1)) { 
    out[out_index++] = *src; 
    src++; 
    } 
    out[out_index] = '\0'; 
    if (*src != '\0') { 
     if (outlen > 0) { 
     out[0] = '\0'; // on failure, copy empty rather than partially 
     } 
     return BUFFER_EXCEEDED; 
    } 
    return COPY_SUCCESSFUL; 
} 

Und wenn Sie C++ verwenden können, nicht nur C, dann würde ich mit std::string vorschlagen.

+3

strcpy ist vollkommen in Ordnung für das, was es tut. Es gibt keine Anzeichen dafür, dass es geplant ist, es im Standard abzulehnen. strncpy ist * sehr * einfach falsch zu benutzen. Ein einfacher "use strncpy" ohne Beispiele für korrekte * und inkorrekte * Verwendung wird nicht helfen. 'strdup' ist nicht standardisiert. –

+0

@strcpy Ich habe nie gesagt, dass "strcpy" veraltet ist (unglücklicherweise wäre es völlig unpraktisch, irgendetwas im POSIX-Standard abzulehnen); strcpy ist jedoch nicht in Ordnung für das, was es tut; strcpy kennt die Größe des Zielpuffers, in den geschrieben wird, nicht. Wenn der Zielpuffer nicht groß genug ist, überschreibt er anderen Speicher. Wie für strdup, ist es tatsächlich Standard (wenn auch nicht der C-Standard); Es ist ein Teil der Single UNIX Specification. Es ist der Hauptnachteil, dass es zu einer zusätzlichen Zuweisung führt, anstatt einen vorhandenen Puffer wie strncpy wiederzuverwenden. –

+2

'strcpy' ist sicherer als' strncpy', weil es niemals eine nicht Null-terminierte Zeichenkette –

Verwandte Themen