3. string.h / strings.h — 字符串操作
提供字符串和内存操作。头文件: <string.h>, <strings.h>。
GNU99 扩展:
-std=gnu99(或显式定义_DEFAULT_SOURCE)时,<strings.h>会额外暴露index/rindex/bzero、<string.h>会额外暴露strlcpy等 BSD 声明;memmem需-D_GNU_SOURCE。-std=c99下这些声明默认不可见。详见 10.8。
3.1 内存操作
void* memcpy(void *dest, const void *src, size_t n)
内存拷贝。
- 输入: dest 目标地址, src 源地址, n 字节数
- 输出: void* dest
- 注意: 源和目标不可重叠
void* memmove(void *dest, const void *src, size_t n)
可重叠内存拷贝。
- 输入: dest 目标地址, src 源地址, n 字节数
- 输出: void* dest
void* memset(void *s, int c, size_t n)
内存填充。
- 输入: s 内存地址, c 填充值(转为 unsigned char), n 字节数
- 输出: void* s
int memcmp(const void *s1, const void *s2, size_t n)
内存比较。
- 输入: s1 内存块1, s2 内存块2, n 字节数
- 输出: int 负=s1<s2, 零=相等, 正=s1>s2
void* memchr(const void *s, int c, size_t n)
在内存中查找字符。
- 输入: s 内存块, c 查找字符, n 字节数
- 输出: void* 找到的位置或 NULL
3.2 字符串操作
char* strcpy(char *dest, const char *src)
字符串拷贝。
- 输入: dest 目标, src 源
- 输出: char* dest
- 注意: 不检查溢出,目标须足够大
char* strncpy(char *dest, const char *src, size_t n)
定长字符串拷贝。
- 输入: dest 目标, src 源, n 最大字节数
- 输出: char* dest
- 注意: 源短于 n 时补 \0,否则目标可能不以 \0 结尾
char* strcat(char *dest, const char *src)
字符串连接。
- 输入: dest 目标, src 源
- 输出: char* dest
- 注意: 不检查溢出
char* strncat(char *dest, const char *src, size_t n)
定长字符串连接。
- 输入: dest 目标, src 源, n 最大追加字节数
- 输出: char* dest
- 注意: 最多追加 n 个字符(不含\0),末尾补 \0
int strcmp(const char *s1, const char *s2)
字符串比较。
- 输入: s1 字符串1, s2 字符串2
- 输出: int 负=s1<s2, 零=相等, 正=s1>s2
int strncmp(const char *s1, const char *s2, size_t n)
定长字符串比较。
- 输入: s1 字符串1, s2 字符串2, n 最大字节数
- 输出: int 负=s1<s2, 零=相等, 正=s1>s2
size_t strlen(const char *s)
获取字符串长度。
- 输入: s 字符串
- 输出: size_t 字节数(不含\0)
char* strchr(const char *s, int c)
查找字符(正向)
- 输入: s 字符串, c 字符
- 输出: char* 首次出现位置或 NULL
- 注意: 查找 \0 时返回字符串末尾
char* strrchr(const char *s, int c)
查找字符(反向)
- 输入: s 字符串, c 字符
- 输出: char* 最后出现位置或 NULL
char* strstr(const char *haystack, const char *needle)
查找子串。
- 输入: haystack 被搜索串, needle 子串
- 输出: char* 首次出现位置或 NULL
- 注意: needle 为空串时返回 haystack
size_t strspn(const char *s, const char *accept)
计算前导接受字符数。
- 输入: s 字符串, accept 接受字符集
- 输出: size_t 前导连续属于 accept 的字符数
size_t strcspn(const char *s, const char *reject)
计算前导非拒绝字符数。
- 输入: s 字符串, reject 拒绝字符集
- 输出: size_t 前导连续不属于 reject 的字符数
char* strpbrk(const char *s, const char *accept)
查找字符集中任意字符。
- 输入: s 字符串, accept 接受字符集
- 输出: char* 首次匹配位置或 NULL
char* strtok(char *str, const char *delim)
分割字符串。
- 输入: str 字符串(首次调用)或 NULL(后续调用), delim 分隔符集合
- 输出: char* 当前 token 或 NULL
- 注意: 修改原字符串
char* strerror(int errnum)
获取错误描述字符串。
- 输入: errnum 错误码
- 输出: char* 错误描述(静态缓冲区)
int strcoll(const char *s1, const char *s2) | 【C90 §7.21.4.3】
按当前 locale 的 LC_COLLATE 比较两字符串。
- 输入: s1 字符串1, s2 字符串2
- 输出: int 负=s1<s2, 零=相等, 正=s1>s2
- 注意: C locale 下等价于
strcmp。
size_t strxfrm(char *dest, const char *src, size_t n) | 【C90 §7.21.4.5】
将字符串变换为可用 strcmp 比较的形式(LC_COLLATE 相关)。
- 输入: dest 目标缓冲区(可为 NULL), src 源字符串, n 最大字节数
- 输出: size_t 变换后字符串长度(不含终止符)
- 注意: C locale 下等价于按长度拷贝。