Unterschied zwischen <string.h> und <strings.h>

90

Ich bemerkte, dass es (zumindest unter Mac OS X) sowohl einen <string.h>Header als auch einen <strings.h>Header gab. man 3 stringzeigt, dass sie unterschiedliche Funktionen enthalten. Gibt es einen Grund dafür?

icktoofay
quelle
2
Für das, was es wert ist, strings.henthält OS X nicht standardmäßige Funktionen bcmp bcopy bzero ffs index rindex strcasecmp strncasecmp… und das war's.
Potatoswatter
3
@Potatoswatter: Es macht genau das, was von POSIX angegeben wird.
R .. GitHub STOP HELPING ICE

Antworten:

114

strings.h stammt aus dem BSD-Zweig in der Unix-Evolution. Der Inhalt wurde von POSIX standardisiert, der größte Teil ist jedoch als Legacy gekennzeichnet und kann problemlos durch andere Funktionen ersetzt werden:

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);
Ein Programmierer
quelle
4
Einige C-Standardbibliotheken haben die nicht veralteten Funktionen von strings.hin zusammengeführt string.h. Siehe z . B. Glibc .
Entropo
19

Fügt <strings.h>dem Standard-Header normalerweise nur einige nützliche, aber nicht standardmäßige zusätzliche Zeichenfolgenfunktionen hinzu <string.h>. Für maximale Portabilität sollten Sie nur verwenden, <string.h>aber wenn Sie die Funktionen in <strings.h>mehr benötigen, als Sie Portabilität benötigen, können Sie <strings.h>stattdessen verwenden <string.h>.

Paul R.
quelle
1
Ich würde die Beschreibung dieser Funktionen als "nützlich" in Frage stellen. Die meisten von ihnen sind hässliche BSD-Duplikate von Standard-ANSI / ISO C-Funktionen mit unterschiedlichen Namen. Die Vergleichsfunktionen für Byte-Strings, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, sind (im Sinne einer plattformübergreifenden Zuverlässigkeit) bei modernen UTF-8-Strings wahrscheinlich nicht nützlich, und selbst wenn sie "funktionieren", bieten sie wahrscheinlich nicht die vom Programmierer gewünschte Semantik. Nur ffsist möglicherweise nützlich.
R .. GitHub STOP HELPING ICE
4
@R.: Sie sind nützlich, wenn Sie älteren BSD-Code zum Kompilieren haben, der diese Funktionen verwendet. ;-)
Paul R