96 votes

Différence entre <string.h> et <strings.h>.

J'ai remarqué qu'il y avait (au moins sur Mac OS X) à la fois une <string.h> et un en-tête <strings.h> en-tête. man 3 string révèle qu'ils contiennent des fonctions différentes. Y a-t-il une raison à cela ?

2 votes

Pour ce que ça vaut, OS X strings.h contient des fonctions non standard bcmp bcopy bzero ffs index rindex strcasecmp strncasecmp et c'est tout.

3 votes

@Potatoswatter : Il fait exactement ce qui est spécifié par POSIX.

118voto

AProgrammer Points 31212

Strings.h provient de la branche BSD de l'évolution unix. Son contenu a été standardisé par POSIX, mais la plupart d'entre lui est marqué comme héritage et peut être facilement remplacé par d'autres fonctions :

int    bcmp(const void *, const void *, size_t); /* LEGACY, see memcmp */
void   bcopy(const void *, void *, size_t); /* LEGACY, see memcpy, memmove */
void   bzero(void *, size_t); /* LEGACY, see memset */
int    ffs(int);
char  *index(const char *, int); /* LEGACY, see strchr */
char  *rindex(const char *, int); /* LEGACY, see strrchr */
int    strcasecmp(const char *, const char *);
int    strncasecmp(const char *, const char *, size_t);

5 votes

Certaines bibliothèques standard C ont fusionné les fonctions non dépréciées de strings.h en string.h . Voir, par exemple, Glibc .

21voto

Paul R Points 104036

Typiquement <strings.h> ajoute simplement à l'en-tête standard quelques fonctions supplémentaires utiles mais non standard pour les chaînes de caractères. <string.h> . Pour une portabilité maximale, vous devez utiliser uniquement <string.h> mais si vous avez besoin des fonctions dans <strings.h> plus que vous n'avez besoin de portabilité, alors vous pouvez utiliser <strings.h> au lieu de <string.h> .

2 votes

Je remettrais en question la description de ces fonctions comme étant "utiles". La plupart d'entre elles sont d'affreux doublons BSD de fonctions C standard ANSI/ISO avec des noms différents. Les fonctions de comparaison insensibles à la casse pour les chaînes d'octets ne sont (dans un sens de fiabilité multiplateforme) probablement pas utiles sur les chaînes UTF-8 modernes, et même si elles "fonctionnent", elles ne fournissent probablement pas la sémantique que le programmeur souhaite. Seul ffs est éventuellement utile.

4 votes

@R. : ils sont utiles si vous avez du code BSD hérité à compiler qui utilise ces fonctions ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X