跳到内容

C 编程/string.h

来自维基教科书,自由的教科书

string.h 是 C 标准库中用于 C 编程语言的标头文件,它包含宏定义、常量以及函数和类型声明,不仅用于字符串处理,还用于各种内存处理函数;因此,这个名字有点误导性。

string.h 中声明的函数非常流行,因为作为 C 标准库的一部分,它们保证在支持 C 的任何平台上都能正常工作。但是,这些函数存在一些安全问题,例如缓冲区溢出,导致程序员更喜欢更安全的、可能不太可移植的变体。此外,字符串函数仅适用于由字节组成的字符编码,例如 ASCII 和 UTF-8。在历史文献中,术语“字符”经常用于代替“字节”,如果按字面意思理解,则意味着不支持多字节编码,例如 UTF-8。BSD 文档已修复以明确这一点,但 POSIX、Linux 和 Windows 文档在许多地方仍然使用“字符”。用于处理由大于字节的代码单元组成的字符编码的函数,例如 UTF-16,通常是通过 wchar.h 实现的。

常量和类型

[编辑 | 编辑源代码]
名称 备注
NULL 展开为空指针常量的宏;也就是说,一个表示指针值的常量,该值保证**不是**内存中对象的有效地址。
size_t 一种无符号整型类型,它是 sizeof 运算符结果的类型。
名称 备注
void *memcpy(void *dest, const void *src, size_t n); 在两个内存区域之间复制 n 个字节;如果有重叠,行为未定义
void *memmove(void *dest, const void *src, size_t n); 在两个内存区域之间复制 n 个字节;与 memcpy 不同的是,这些区域可能重叠
void *memchr(const void *s, int c, size_t n); 返回指向 s 的前 n 个字节中第一个出现的 c 的指针,如果未找到则返回 NULL
int memcmp(const void *s1, const void *s2, size_t n); 比较两个内存区域的前 n 个字节
void *memset(void *, int c, size_t n); 用 n 个 c 的副本覆盖一个内存区域
char *strcat(char *dest, const char *src); 将字符串 src 附加到 dest
char *strncat(char *dest, const char *src, size_t n); 将字符串 src 的最多 n 个字节附加到 dest
char *strchr(const char *, int c); 从开头开始查找字符串中的字节 c
char *strrchr(const char *, int c); 从结尾开始查找字符串中的字节 c
int strcmp(const char *, const char *); 按字典顺序比较两个字符串
int strncmp(const char *, const char *, size_t n); 按字典顺序比较两个字符串的前 n 个字节
int strcoll(const char *, const char *); 使用当前区域设置的排序顺序比较两个字符串
char *strcpy(char *dest, const char *src); 将字符串从一个位置复制到另一个位置
char *strncpy(char *dest, const char *src, size_t n); 将恰好 n 个字节写入 dest,从 src 复制或添加 0
char *strerror(int); 返回错误号的字符串表示,例如 errno(非线程安全)
size_t strlen(const char *); 查找 C 字符串的长度
size_t strspn(const char *, const char *accept); 确定完全由 accept 中的字节组成的最大初始子字符串的长度
size_t strcspn(const char *, const char *reject); 确定完全由不在 reject 中的字节组成的最大初始子字符串的长度
char *strpbrk(const char *, const char *accept); 查找 accept 中任何字节的第一个出现
char *strstr(const char *haystack, const char *needle); 查找更长字符串“haystack”中字符串“needle”的第一个出现
char *strtok(char *, const char * delim); 将字符串解析为一系列标记;在规范中是非线程安全的,不可重入[1]
size_t strxfrm(char *dest, const char *src, size_t n); 将 src 转换为排序形式,以便转换后字符串的数字排序顺序等同于 src 的排序顺序

ISO C 的扩展

[编辑 | 编辑源代码]
名称 备注 规范
void *memccpy(void *dest, const void *src, int c, size_t n); 在两个内存区域之间复制最多 n 个字节,这些区域不能重叠,当找到字节 c 时停止 SVID、POSIX[2]
void *mempcpy(void *dest, const void *src, size_t n); memcpy 的变体,返回指向最后一个写入字节之后的字节的指针 GNU
errno_t strcat_s(char *dest, size_t n, const char *src); strcat 的边界检查变体 ISO/IEC WDTR 24731
errno_t strcpy_s(char *dest, size_t n, const char *src); strcpy 的边界检查变体 ISO/IEC WDTR 24731
char *strdup(const char *src); 在内存中分配并复制一个字符串 POSIX;最初是 BSD 扩展
int strerror_r(int, char *, size_t); 以线程安全的方式将 strerror() 的结果放入提供的缓冲区中。 POSIX:2001
char *strerror_r(int, char *, size_t); 以线程安全的方式返回 strerror()。提供的缓冲区仅在必要时使用(与 POSIX 版本不兼容)。 GNU
size_t strlcat(char *dest, const char *src, size_t n); strcat 的边界检查变体 最初是 OpenBSD,现在也是 FreeBSD、Solaris、Mac OS X
size_t strlcpy(char *dest, const char *src, size_t n); strcpy 的边界检查变体 最初是 OpenBSD,现在也是 FreeBSD、Solaris、Mac OS X
char *strsignal(int sig); strerror 相似,返回信号 sig 的字符串表示(非线程安全) POSIX:2008[3]
char *strtok_r(char *, const char *delim, char **saveptr); strtok 的线程安全且可重入版本[1] POSIX

参考文献

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]
华夏公益教科书