本文地址:http://www.cnblogs.com/archimedes/p/c-library-string.html,转载请注明源地址。
1.背景知识
<string.h>中声明的函数是对标准C的一个重要补充,它们支持C语言把文本作为字符数组操作的传统。
string.h是C语言中C标准库的头文件,其中包含了宏定义、常量以及函数和类型的声明,涉及的内容除了字符串处理之外,还包括大量的内存处理函数;因此,string.h
这个命名是不恰当的。在string.h
中定义的函数十分常用,作为C标准库的一部分,它们被强制要求可以在任何支持C语言的平台上运行。但是,部分函数存在一些安全隐患,例如缓存溢出等,导致程序员宁愿使用一些更安全的函数而放弃一定的可移植性。同时,这些字符串函数只能处理ASCII字符集或兼容ASCII的字符集,如ISO-8859-1;在处理存在多字节字符的字符集,如UTF-8时,会产生一个警告,指出对字符串“长度”的计算是以字节而不是以Unicode字符为单位。非ASCII兼容字符集的字符串处理函数一般位于wchar.h
中。
C标准库提供了所有重要的功能。这些函数可以对一下3种形式的串进行操作:
-
名字以mem开头的函数对任意的字符序列进行操作
-
名字以strn开头的函数对非空字符序列进行操作
-
所有其他名字以str开头的函数对空字符结尾的字符序列进行操作
2.<string.h>的内容
常量和类型
名称 | 说明 |
---|---|
NULL |
表示空指针常量的宏,即表示一个不指向任何有效内存单元地址的指针常量。 |
size_t |
无符号整型,被用于sizeof 运算符的返回值类型。 |
代码如下:
#ifndef _STRING_H #define _STRING_H #define NULL ((void *)0) #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; /* type returned by sizeof */ #endif /*_SIZE_T */
函数
名称 | 说明 |
---|---|
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 *strCharSet); |
从字符串s的起始处开始,寻找第一个不出现在strCharSet中的字符,返回其位置索引值 |
size_t strcspn(const char *s, const char *strCharSet); |
从字符串s的起始处开始,寻找第一个出现在strCharSet中的字符,返回其位置索引值 |
char *strpbrk(const char *s, const char *strCharSet); |
在字符串s中查找strCharSet中任意字符第一次出现的位置的指针值 |
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); |
根据当前locale转换一个字符串为strcmp使用的内部格式 |
函数原型代码如下:

void *memchr(const void *_s, int _c, size_t _n); int memcmp(const void *_s1, const void *_s2, size_t _n); void *memcpy(void *_s1, const void *_s2, size_t _n); void *memmove(void *_s1, const void *_s2, size_t _n); void *memset(void *_s, int _c, size_t _n); char *strcat(char *_s1, const char *_s2); char *strchr(const char *_s, int _c); int strncmp(const char *_s1, const char *_s2, size_t _n); int strcmp(const char *_s1, const char *_s2); int strcoll(const char *_s1, const char *_s2); char *strcpy(char *_s1, const char *_s2); size_t strcspn(const char *_s1, const char *_s2); char *strerror(int _errnum); size_t strlen(const char *_s); char *strncat(char *_s1, const char *_s2, size_t _n); char *strncpy(char *_s1, const char *_s2, size_t _n); char *strpbrk(const char *_s1, const char *_s2); char *strrchr(const char *_s, int _c); size_t strspn(const char *_s1, const char *_s2); char *strstr(const char *_s1, const char *_s2); char *strtok(char *_s1, const char *_s2); size_t strxfrm(char *_s1, const char *_s2, size_t _n);
3.<string.h>的实现

void * memcpy(void *s1, const void *s2, register size_t n) { register char *p1 = s1; register const char *p2 = s2; if (n) { n++; while (--n > 0) { *p1++ = *p2++; } } return s1; }
2、void *memmove( void* dest, const void* src, size_t count );
功能:由src所指内存区域复制count个字节到dest所指内存区域
返回:函数返回指向dest的指针

void * memmove(void *s1, const void *s2, register size_t n) { register char *p1 = s1; register const char *p2 = s2; if (n>0) { if (p2 <= p1 && p2 + n > p1) { /* overlap, copy backwards */ p1 += n; p2 += n; n++; while (--n > 0) { *--p1 = *--p2; } } else { n++; while (--n > 0) { *p1++ = *p2++; } } } return s1; }
3、void *memchr(const void *buf, int ch, size_t count);

void *memchr(const void *s, register int c, register size_t n) { register const unsigned char *s1 = s; c = (unsigned char) c; if (n) { n++; while (--n > 0) { if (*s1++ != c) continue; return (void *) --s1; } } return NULL; }
4、int memcmp(const void *buf1, const void *buf2, unsigned int count);

int memcmp(const void *s1, const void *s2, size_t n) { register const unsigned char *p1 = s1, *p2 = s2; if (n) { n++; while (--n > 0) { if (*p1++ == *p2++) continue; return *--p1 - *--p2; } } return 0; }

void *memset(void *s, register int c, register size_t n) { register char *s1 = s; if (n>0) { n++; while (--n > 0) { *s1++ = c; } } return s; }
6、char *strcat(char *dest,char *src);
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的' ')并添加' '。

char *strcat(char *ret, register const char *s2) { register char *s1 = ret; while (*s1++ != '