<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

3
@Potatoswatter:它正在执行POSIX指定的功能。
R .. GitHub停止帮助ICE,2010年

Answers:


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 2011年

19

通常,<strings.h>只需在标准标头中添加一些有用但非标准的附加字符串函数<string.h>。为了获得最大的可移植性,您应该只使用,<string.h>但是如果您需要的功能<strings.h>超出了可移植性,则可以使用<strings.h>代替<string.h>


1
我会质疑这些功能的描述“有用”。它们大多数是标准ANSI / ISO C函数的丑陋BSD副本,但名称不同。字节字符串的不区分大小写的比较函数(从跨平台可靠性的角度来看)可能在现代UTF-8字符串上不起作用,即使它们“起作用”,它们也可能无法提供程序员想要的语义。仅ffs可能有用。
R .. GitHub停止帮助ICE,2010年

4
@R .:如果您有使用这些功能进行编译的旧版BSD代码,则它们很有用。;-)
Paul R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.