A quoi sert la valeur de retour de strcat()? Parfois, les fonctions standard sont ce qu'elles sont spécifiées et non ce qu'elles devraient être.
DevSolar
4
@MatthieuM .: De plus, il y a généralement un coût non nul associé au retour des choses. Même si la valeur de retour tient dans un registre, vous devez généralement charger cette valeur dans le registre. Cela a un coût, même minime.
NPE
15
@sharptooth: Une fonction "tuer tous les humains" renverrait le nombre d'humains tués, bien sûr.
indiv
2
@MatthieuM .: Vous ne vous soucieriez pas de telles anecdotes, mais je pourrais certainement. Et si j'écris un compilateur pour un système de ressources limitées? Hmmm?
Thomas Eding
Réponses:
34
La signature est conforme à toutes les autres fonctions similaires: memcpy(), strcpy()etc. J'ai toujours pensé cela a été fait pour permettre de enchaîner les appels à ces fonctions, et d' utiliser autrement ces appels dans les expressions.
Cela dit, je n'ai jamais rencontré de situation réelle dans laquelle je me sentirais obligé d'utiliser la valeur de retour de cette manière.
Oui, c'est certainement le cas d'utilisation du «chaînage».
Cartesius00
6
J'ai voté pour la réponse, car c'est un cas intéressant. Mais dans la vraie vie, je pense qu'il est préférable de séparer les appels memset et strcpy.
Tsvetomir Dimitrov
24
Les programmeurs C aiment le code illisible, donc permettre un chaînage infini est un must lors de la conception d'une fonction standard.
Chad Schouggins
@ChadSchouggins Lisez du code haskell et vous savez que les c-programmeurs sont en fait assez verbatim;) (pense à l'expression régulière "operator" = ~) ...
BitTickler
Bien sûr, dans cet exemple, cela aurait même plus de sens, l'inverse, strcpyde renvoyer le pointeur au-delà du dernier copié. memset(my_strcpy(a, "bla"), 0, a + 200);(comme std::copy_net std::fill_nfaire en C ++).
alfC
12
Afin d'utiliser la fonction comme argument pour une autre fonction telle que sprintf
strcat()
? Parfois, les fonctions standard sont ce qu'elles sont spécifiées et non ce qu'elles devraient être.Réponses:
La signature est conforme à toutes les autres fonctions similaires:
memcpy()
,strcpy()
etc. J'ai toujours pensé cela a été fait pour permettre de enchaîner les appels à ces fonctions, et d' utiliser autrement ces appels dans les expressions.Cela dit, je n'ai jamais rencontré de situation réelle dans laquelle je me sentirais obligé d'utiliser la valeur de retour de cette manière.
la source
Il peut être utilisé pour le chaînage d'appels comme:
la source
strcpy
de renvoyer le pointeur au-delà du dernier copié.memset(my_strcpy(a, "bla"), 0, a + 200);
(commestd::copy_n
etstd::fill_n
faire en C ++).Afin d'utiliser la fonction comme argument pour une autre fonction telle que
sprintf
la source
Je suis tombé sur cette question en cherchant sur Google pour voir ce que memset retournait.
J'ai un code dans lequel je teste une valeur, puis si c'est vrai, testez si une valeur est égale à des zéros.
Comme il n'y a pas de moyen complètement portable en C de tester les zéros, je dois exécuter memset au milieu.
Donc mon code est:
Cela témoigne de l'objectif de chaînage indiqué dans les questions précédentes, mais c'est un exemple d'utilisation de cette technique.
Je laisserai aux autres le soin de juger si c'est un bon codage ou non.
la source