C 编程/string.h
外观
< C 编程
(重定向自 C 编程/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 的排序顺序 |
名称 | 备注 | 规范 |
---|---|---|
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 |
- Linux 库函数 手册 : 字符串操作 –
- 从 C 继承的字符串函数的 C++ 参考