2016-12-11 1 views
1

Je voudrais savoir s'il y a une différence entre char* test = "test" et strcpy(test, "test"), et s'il y en a une, quelle est cette différence.Quelle est la différence entre strcpy et "="?

Merci.

+0

Oui, il y a. 'strcpy' écrase l'emplacement dans la mémoire qui stocke la chaîne,' test = "string" 'change à peine ce à quoi' test' pointe. – saeleko

+3

Vous pouvez trouver [cette question] (https://stackoverflow.com/questions/6901090/c-why-is-strcpy-necessary) intéressante. – WhozCraig

+0

@WhozCraig - La réponse à cette question semble répondre parfaitement à celle-ci. Pourquoi ne pas le marquer comme un dup? – StoryTeller

Répondre

1

La fonction strcpy (! que vous ne devez jamais utiliser - utiliser strncpy ou strdup pour éviter les failles de dépassement de mémoire tampon), copie les octets d'un tampon de chaîne à l'autre; L'affectation change le tampon vers lequel vous pointez. Notez que pour appeler strncpy (ou strcpy, mais ne le faites pas!) Vous devez avoir un buffer déjà alloué pour faire cette copie. Lorsque vous effectuez une affectation à partir d'une chaîne littérale, le compilateur a effectivement créé un tampon en lecture seule et votre pointeur est mis à jour avec l'adresse de celui-ci.

MISE À JOUR

Comme indiqué dans les commentaires, strncpy a ses inconvénients aussi. Il vaut mieux utiliser vos propres fonctions d'assistance pour copier les données d'un tampon à un autre. Par exemple:

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; 
} 

Et, si vous pouvez utiliser C++, pas seulement C, alors je suggère d'utiliser std::string.

+3

strcpy est parfaitement bien pour ce qu'il fait. Il n'y a aucun signe de plans pour le déprécier dans la norme. strncpy est * très * facile à utiliser incorrectement. Un simple "use strncpy" sans aucun exemple d'utilisation correcte * et incorrecte * ne va pas aider. 'strdup' est non standard. –

+0

@strcpy Je n'ai jamais dit que strcpy est obsolète (malheureusement, tout ce qui est obsolète dans la norme POSIX serait complètement impraticable); cependant, strcpy n'est pas acceptable pour ce qu'il fait; strcpy ne connaît pas la taille du tampon de destination sur lequel il écrit, donc si le tampon de destination n'est pas assez grand, il remplacera l'autre mémoire. Quant à strdup, il est en fait standard (mais pas le standard C); il fait partie de la spécification UNIX unique. Son principal inconvénient est qu'il entraîne une allocation supplémentaire plutôt que de réutiliser un tampon existant comme strncpy. –

+2

'strcpy' est plus sûr que' strncpy' car il ne génère jamais une chaîne non-terminée par un zéro –