<string.h>と<strings.h>の違い


90

(少なくともMac OS Xでは)<string.h>ヘッダーとヘッダーの両方があることに気づきました<strings.h>man 3 stringそれらが異なる機能を含んでいることを明らかにします。これには理由がありますか?


2
価値があるのは、OS Xにstrings.hは非標準の機能が含まれbcmp bcopy bzero ffs index rindex strcasecmp strncasecmpているということです…それだけです。
Potatoswatter 2010年

3
@Potatoswatter:POSIXで指定されていることを正確に実行しています。
R .. GitHub ICE HELPING ICEの停止

回答:


114

strings.hは、UNIXの進化におけるBSDブランチに由来します。その内容はPOSIXによって標準化されていますが、そのほとんどはレガシーとしてマークされており、他の関数と簡単に置き換えることができます。

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);

4
一部のC標準ライブラリでは、非推奨ではない関数がにマージstrings.hされていstring.hます。たとえば、Glibcを参照してください。
entropo

19

通常<strings.h>、標準ヘッダーにいくつかの便利だが非標準の追加の文字列関数を追加します<string.h>。移植性を最大にするために使用<string.h>する必要がありますが、<strings.h>移植性が必要以上の機能が必要な場合は、の<strings.h>代わりに使用できます<string.h>


1
私はこれらの機能の説明を「役に立つ」と質問します。それらのほとんどは、異なる名前の標準ANSI / ISO C関数の醜いBSD複製です。大文字と小文字を区別しないバイト文字列の比較関数は(クロスプラットフォームの信頼性の意味で)おそらく最新のUTF-8文字列には役に立たず、それらが「機能する」場合でも、プログラマーが望む意味論を提供しない可能性があります。ffsおそらく役に立つだけです。
R .. GitHub ICE HELPING ICEの停止

4
@R .:これらは、これらの関数を使用してコンパイルするレガシーBSDコードがある場合に役立ちます。;-)
Paul R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.