<string.h>
章节大纲
-
<string.h>
– 字符串处理(String Handling)C 语言的实现可以自由地对任何数据类型施加特定的内存对齐要求。因此,当你复制一个已对齐的对象到内存中时,你必须保证目标副本的对齐同样满足要求。
否则,复制出的对象可能无法访问或被错误解释。这意味着:程序员必须确保复制后的对象既符合格式,又处于可正确使用的内存位置。
标准 C 保留所有以
str
、mem
或wcs
开头、后跟小写字母的函数名,以供将来在本头文件中添加更多函数。参见附录内容:C11 的“边界检查接口”可能要求实现向该头文件添加更多内容。
C++ 注意事项:对应标准 C++ 头文件为
<cstring>
。
复制函数(Copying Functions)
memcpy
函数-
如果两个内存块重叠,行为未定义。
memmove
函数-
由 C89 引入。
-
与
memcpy
不同,它可以处理重叠内存区域。
strcpy
函数-
若源字符串与目标字符串重叠,行为未定义。
strncpy
函数-
同样,重叠行为未定义。
拼接函数(Concatenation Functions)
strcat
函数-
若两个字符串重叠,行为未定义。
strncat
函数-
同样,重叠行为未定义。
比较函数(Comparison Functions)
建议:
所有比较函数都会返回一个整数,表示:-
小于 0:前者小于后者
-
等于 0:相等
-
大于 0:前者大于后者
切勿假设返回值的具体正负值具有特定含义,应只与 0 作比较,而不是特定非零值。
strcoll
函数-
比较方式依赖当前区域设置(locale)
-
由 C89 引入。
strxfrm
函数-
由 C89 引入,用于字符串转换,便于按
strcoll
的方式比较。
strstr
函数-
由 C89 引入,用于查找子字符串。
其他函数(Miscellaneous Functions)
strerror
函数-
返回的错误信息内容为实现定义。
-
不要尝试修改其返回的字符串内容。
<tgmath.h>
– 类型泛化数学函数(Type-Generic Math)该头文件由 C99 引入,用于在不指定具体类型的情况下调用
math.h
或complex.h
中的函数(即允许编译器根据实参类型自动选择对应的版本,如float
、double
、long double
)。C++ 注意事项:对应 C++ 头文件为
<ctgmath>
,但在 C++17 中已被弃用。
<threads.h>
– 线程支持(Threads)该头文件由 C11 引入。
如果某个实现支持关键字
_Thread_local
(可通过宏__STDC_NO_THREADS__
判断),则它也会提供<threads.h>
头文件。因此,你应使用如下方式启用线程局部存储:
#include <threads.h> void f() { thread_local static int tlsI = 0; … }
其中,
thread_local
是<threads.h>
中定义的宏,映射为_Thread_local
,也与 C++ 中的同名关键字一致。标准 C 保留所有以以下前缀开头、后跟小写字母的名称,用于在本头文件中未来扩展:
-
函数名:
cnd_
、mtx_
、thrd_
、tss_
-
类型名和枚举常量也遵循上述命名规则
C++ 注意事项:标准 C++ 没有对应的头文件。
-