Quelle est la différence entre strcpy et stpcpy?

En lisant la page de strcpy de strcpy , j’ai découvert que la fonction stpcpy également. Cependant, la seule différence que j’ai pu remarquer dans la page de manuel est la suivante:

 char * stpcpy(char *s1, const char *s2); char * strcpy(char *ressortingct s1, const char *ressortingct s2); 

Alors, qu’est-ce que ressortingct signifie ici?

La ressortingct indique au compilateur que s1 et s2 pointent vers des tableaux différents et qu’il n’y a pas de chevauchement dans les tableaux pointés. Dans certains cas, cela peut permettre au compilateur d’effectuer des optimisations supplémentaires (par exemple, il pourrait éventuellement copier des blocs de plusieurs caractères sans avoir à vérifier le chevauchement).

Notez également que la valeur de retour est différente: stpcpy renvoie un pointeur sur le \0 copié dans le tampon de destination, tandis que strcpy renvoie un pointeur sur le début de la chaîne (il return s1; fait un return s1; ).

La question que vous posez dans le titre et la question à propos de ressortingct sont en réalité deux questions totalement différentes les unes des autres. Les autres réponses vous ont déjà fourni de bons liens qui vous aideront à en savoir plus sur ressortingct .

Cependant, la principale différence entre ces deux fonctions ne réside pas vraiment dans le spécificateur de ressortingct . En fait, dans la version C99 de la spécification du langage C, strcpy également une ressortingct qualification sur ses parameters. Ce que vous voyez sur votre page de strcpy pour strcpy n’est tout simplement pas mis à jour pour être conforme à C99.

La principale différence (que vous semblez avoir manquée) est la valeur de retour de stpcpy . stpcpy renvoie le pointeur sur le caractère stpcpy \0 de la chaîne cible. Cela clarifie immédiatement le but de stpcpy et la raison de son existence: cette fonction est destinée à être utilisée en remplacement intelligent de la fonction strcat dans les cas où vous devez concaténer plusieurs sous-chaînes en une seule chaîne. Vous voyez, strcat fonctionne assez mal dans une telle application (je dirais même que strcat n’a aucune utilisation significative dans du code réel). Le problème avec strcat est qu’il relance l’parsing de la chaîne de destination à chaque fois que vous y ajoutez quelque chose, effectuant ainsi beaucoup de travail inutile et générant plus de chaleur que de lumière. Par exemple, le code suivant souffre de ce problème

 const char *part1, *part2, *part3, *part4; ... char buffer[size]; /* assume that `size` is calculated properly */ strcpy(buffer, part1); strcat(buffer, part2); strcat(buffer, part3); strcat(buffer, part4); 

Ce code peut être réimplémenté de manière beaucoup plus raisonnable en utilisant stpcpy

 stpcpy(stpcpy(stpcpy(stpcpy(buffer, part1), part2), part3), part4); 

Et si vous n’aimez pas les appels en chaîne, vous pouvez utiliser un pointeur intermédiaire pour stocker la valeur de retour des appels stpcpy intermédiaires stpcpy

 char *end = buffer; end = stpcpy(end, part1); end = stpcpy(end, part2); end = stpcpy(end, part3); end = stpcpy(end, part4); 

Bien sûr, il convient de mentionner que strcpy et strcat sont des fonctions standard, alors que stpcpy ne l’est pas.

Entrée Wikipedia pour ressortingct

En bref, ressortingct indique au compilateur que les segments de mémoire pointés par s1 et s2 ne se chevauchent pas; Cela permet au code d’effectuer moins de vérification d’erreur.

La fonction stpcpy() copie la chaîne pointée par src (y compris le caractère '\0' final) dans le tableau pointé par dest. Les chaînes ne peuvent pas se chevaucher et la chaîne de destination destination doit être suffisamment grande pour recevoir la copie.

Cela satisfait aux exigences de ressortingct , même si ce n’est pas dans la signature de la fonction. Si C99 est présent, il pourrait être ajouté.

stpcpy() renvoie un pointeur sur la fin de la chaîne dest (c’est-à-dire l’adresse de l’octet nul final) plutôt que sur le début.

Cela vous permet de concaténer beaucoup de chaînes plus facilement et plus efficacement, car src peut être “cloué” sur le pointeur renvoyé par le dernier stpcpy() . L’implémentation naïve de l’alternative, strcat doit localiser la fin de la chaîne de dest avant de pouvoir commencer à copier.

Notez les points suivants:

Cette fonction ne fait pas partie des standards C ou POSIX.1 et n’est pas habituelle sur les systèmes Unix, mais n’est pas non plus une invention de GNU. Cela vient peut-être de MS-DOS. De nos jours, il est également présent sur les BSD.

L’autre différence est la valeur de retour. Extrait de la page de manuel: “Les fonctions strcpy () et strncpy () renvoient s1. La fonction stpcpy () renvoie un pointeur sur le caractère` \ 0 ‘final de s1. ”

strcpy renvoie s1 mais stpcpy renvoie s1 + strlen (s2).