De l'inutilité de la valeur de retour de strcat/strcpy

De l'inutilité de la valeur de retour de strcat/strcpy - C - Programmation

Marsh Posté le 05-11-2003 à 03:55:35    

Il y a une question que je me pose depuis longtemps : à quoi sert la valeur de retour de strcat() et strcpy() ?
 
Comme vous le savez certainement une « erreur de style » fréquente est d'utiliser une série de strcat() pour construire une chaine. C'est particulièrement inefficace puisque strcat() commence par chercher le '\0' final de la chaine de destination. Par exemple dans

Code :
  1. strcpy(dst, machin);
  2. strcat(dst, " est un " );
  3. strcat(dst, machin);

on va chercher 2 fois le '\0' final d'un dst qui est de plus en plus grand.
 
Si strcat() et strcpy() renvoyaient un pointeur vers le '\0' final, alors ce serait super simple de faire efficace :

Code :
  1. end = strcpy(dst, machin);
  2. end = strcpy(end, " est un " );
  3. end = strcpy(end, machin);


 
Donc la question est : mais pourquoi strcat() et strdup() renvoient un pointeur vers la chaine de destination ? C'est complètement inutile, et en plus je la connais puisque je l'ai passée en argument...


Message édité par matafan le 05-11-2003 à 04:06:24
Reply

Marsh Posté le 05-11-2003 à 03:55:35   

Reply

Marsh Posté le 05-11-2003 à 04:13:39    

En fait je viens de voir que la glibc propose la fonction non « standards » stpcpy(), qui fait exactement ça.
 
La question devient donc : y-a-t'il une raison particulière au choix de POSIX et de l'ISO ? Est-ce que le gars qui a crée strcpy() a réfléchi deux minutes avant de choisir la valeur de retour de sa fonction ? Et pouquoi ne fait-on pas entrer stpcpy() dans les standards POSIX et ISO ?

Reply

Marsh Posté le 05-11-2003 à 10:13:15    

pour pouvoir faire ca :
strcat(strcat(strcat(roger,poupou),josianne),milou);


Message édité par chrisbk le 05-11-2003 à 12:28:11
Reply

Marsh Posté le 05-11-2003 à 12:27:19    

chrisbk a écrit :

pour pouvoir faire ca :
strcat(strcat(strcat(roger,poupou)));
 


 
On se croirait en scheme :D

Reply

Marsh Posté le 05-11-2003 à 13:40:03    

Yep, la chaîne est réutilisable aussitôt :
puts(strcat(...)); par exemple
 
Le pointeur sur le 0 final est obtenu simplement par :
chaine + strlen(chaine)
dans le cas où est chaine est un char* pointant sur une chaine valide.


---------------
Slack powa | http://www.racingpneu.com
Reply

Marsh Posté le 05-11-2003 à 13:48:49    

Vinx a écrit :

Yep, la chaîne est réutilisable aussitôt :
puts(strcat(...)); par exemple
 
Le pointeur sur le 0 final est obtenu simplement par :
chaine + strlen(chaine)
dans le cas où est chaine est un char* pointant sur une chaine valide.


 
strlen implique alors une seconde itération des caractères de la chaine, ce qui n'est vraiment pas négligeable dnas certains cas.

Reply

Marsh Posté le 06-11-2003 à 03:42:43    

Oui tout a fait. Et sinon le coup de « réutiliser tout de suite le résultat » ça sert juste à condenser deux lignes en une, c'est à dire à rien.
 
Je continue de penser qu'on devrait pendre l'inventeur des strcat et strdup, pour avoir condamné les générations passée et futures à utiliser d'infâmes contournements :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed