跳转到内容

string.h

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由Smallay留言 | 贡献2010年12月1日 (三) 06:07 (翻译)编辑。这可能和当前版本存在着巨大的差异。

string.hC语言C标准库头文件,其中包含了定义、常量以及函数和类型的声明,涉及的内容除了字符串处理之外,还包括大量的内存处理函数;因此,string.h这个命名是不恰当的。

string.h中定义的函数十分常用,作为C标准库的一部分,它们被强制要求可以在任何支持C语言的平台上运行。但是,部分函数存在一些安全隐患,例如缓存溢出等,导致程序员宁愿使用一些更安全的函数而放弃一定的可移植性。同时,这些字符串函数只能处理ASCII字符集或兼容ASCII的字符集,如ISO-8859-1;在处理存在多字节字符的字符集,如UTF-8时,会产生一个警告,指出对字符串“长度”的计算是以字节而不是以Unicode字符为单位。非ASCII兼容字符集的字符串处理函数一般位于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, char c, size_t n); 在从s开始的n个字节内查找c第一次出现的地址并返回,若未找到则返回NULL
int memcmp(const void *s1, const void *s2, size_t n); 对从两个内存地址开始的n个字符进行比较
void *memset(void *, int, size_t); 用某种字节内容覆写一段内存空间
char *strcat(char *dest, const char *src); 在字符串dest之后连接上src
char *strncat(char *dest, const char *src, size_t n); 在字符串dest之后连接上src,最多增加n个字符
char *strchr(const char *, int); 从字符串头开始查找某字符出现的位置
char *strrchr(const char *, int); 从字符串尾开始查找某字符出现的位置
int strcmp(const char *, const char *); 基于字典顺序比较两个字符串
int strncmp(const char *, const char *, size_t); 基于字典顺序比较两个字符串,最多比较n个字节
int strcoll(const char *, const char *); 基于当前区域设置字符顺序比较两个字符串
char *strcpy(char *toHere, const char *fromHere); 将一个字符串从一个位置复制到另一个位置
char *strncpy(char *toHere, const char *fromHere, size_t); 将一个字符串从一个位置复制到另一个位置,最多复制n个字节
char *strerror(int); 返回错误码对应的解释字符串,参见errno.h(非线程安全函数)
size_t strlen(const char *); 返回一个字符串的长度
size_t strspn(const char *s, const char *accept); 从字符串s的起始处开始,寻找所有字符都在accept中出现的最大子串,返回其长度
size_t strcspn(const char *s, const char *reject); 从字符串s的起始处开始,寻找所有字符都不在reject中出现的最大子串,返回其长度
char *strpbrk(const char *s, const char *accept); 在字符串s中查找accept中任意字符第一次出现的位置
char *strstr(const char *haystack, const char *needle); 在字符串haystack中查找字符串needle第一次出现的位置,heystack的长度必须长于needle
char *strtok(char *, const char *); 将一个字符串分隔成一系列字串;此函数非线程安全,且不可重入
size_t strxfrm(char *dest, const char *src, size_t n); transforms src into a collating form, such that the numerical sort order of the transformed string is equivalent to the collating order of src.

ISO C扩展函数

名称 说明 标准
void *memccpy(void *dest, const void *src, int c, size_t n

);

在两块不重叠的内存地址间复制内容,直至复制了n字节或遇到内容为c的字节 UNIX 98?
void *mempcpy(void *dest, const void *src, size_t n); memcpy的变体,返回写入的最后一个字节的地址指针 GNU
errno_t strcat_s(char *s1, size_t s1max, const char *s2); strcat的变体,带边界检查 ISO/IEC WDTR 24731
errno_t strcpy_s(char *s1, size_t s1max, const char *s2); strcpy的变体,带边界检查 ISO/IEC WDTR 24731
char *strdup(const char *); 将字符串的内容复制到一段新分配的内存空间 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,现在也可以在FreeBSDSolarisMac OS X中找到
size_t strlcpy(char *dest, const char *src, size_t n); strcpy的变体,带边界检查 首先定义于OpenBSD,现在也可以在FreeBSDSolarisMac OS X中找到
char *strsignal(int sig); strerror类似,返回有符号数sig对应的错误解释字符串(非线程安全函数) BSDs, Solaris, Linux
char *strtok_r(char *, const char *, char **); strtok的线程安全且可重入的版本 POSIX

外部链接