跳到主要内容

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 下等价于按长度拷贝。