6
votes

C: Pourquoi Strcpy renvoie-t-il son argument?

pourquoi strcpy (3) (et strncpy (3) ) renvoie leur premier argument? Je ne vois pas comment cela ajoute une valeur. Au lieu de cela, je préférerais souvent avoir le nombre de bytes copiés retournés.

addendum: qu'est-ce que je suis censé faire quand j'ai besoin aussi de la longueur de la chaîne résultante? Dois-je vraiment mettre en œuvre ma propre version?


4 commentaires

Afin qu'il puisse être utilisé dans la chaîne de fonction.


Il serait beaucoup plus utile si une variante de Strcpy () a renvoyé un pointeur sur le '\ 0' octet à la fin de la chaîne. Toutefois, si vous vérifiez tout avant de faire votre copie (comme vous devez être en sécurité), vous pouvez utiliser Memmove () (ou peut-être memcpy () ) au lieu de Strcpy () . Ce n'est que lorsque vous n'avez pas de longueur disponible qui ne peut pas utiliser celles-ci, mais il n'est sans doute pas sûr de faire la copie si vous ne connaissez pas les longueurs de la chaîne source et du tampon cible.


@Jonathanleffler Re: "Ce serait beaucoup plus utile si une variante de Strcpy () a renvoyé un pointeur sur l'octet" \ 0 "à la fin de la chaîne" : il y a (dans POSIX). Ça s'appelle STPCPY (3) .


memccpy (3) , Ce qui sera en C2X, est également très similaire à STPCPY (3) , et peut être utile pour éviter de prolonger les chaînes d'entrée non valides.


3 Réponses :


1
votes

afin que vous puissiez faire quelque chose comme xxx


5 commentaires

... Le danger dont on n'aura pas échappé à quiconque qui a vu la version de cette réponse avec 11 12 est maintenant.


Pourquoi pas simplement utiliser STRUP? Ou était-ce manquant à ces moments?


STRUP est, je pense, un ajout des années 1980, lorsque c avait déjà divergé dans les dialectes. Ce n'était pas dans V7 Unix, ce n'est toujours pas dans l'ISO C, même si POSIX l'a toujours eu.


L'autre danger avec le chaînage avec MALLOC () est l'accident qui se produit lorsque l'allocation de mémoire échoue!


@Jonathanleffler: Vous pouvez le faire avec un XMALLOC sur mesure , cependant.



3
votes

Pour des raisons historiques. Strcpy code> et Date de retour au début des années soixante-dix, et je suppose que l'étui d'utilisation prévu pour la valeur de retour serait une sorte de chaînage:

char *temp = xmalloc(strlen(const_str) + 1);
function_that_takes_mutable_str(strcpy(temp, const_str));


2 commentaires

N'avaient-ils pas d'expressions de la virgule à l'époque? fonction1 ((Strcpy (buf1, const_str), buf1)) .


@Joso: Je ne suis pas sûr que des expressions de la virgule ont été introduites, mais j'ai lu beaucoup de vieux code C et je ne pense pas avoir jamais vu d'être utilisé. Personnellement, je ne l'utilise pas non plus, sauf dans les macros.



1
votes

La plupart des fonctions de chaîne de la bibliothèque C ont été conçues par des amateurs. Par exemple, au cours de mes 25 années de ma carrière, je n'ai jamais utilisé la fonction Strcat (), mais je concaténe des cordes tout le temps. De plus, si vous pensez que le printf (), il y a peu de documentation si vous passez NULL pour un argument% s. Il en va de même pour le% C passant un '\ 0' ou un malloc (0).

Malheureusement, le plus utile Strcpy () doit renvoyer un pointeur à la fin du tampon de destination pour la copie de la chaîne.


0 commentaires