一、字符串函数
strlen()
strlen()函数是用以计算字符串长度的函数。size_t strlen(const char* string)
- 返回值是size_t,也就是无符号整形
- 计算的是字符串中'\0'以前的字符的个数
- 参数指向的字符串必须以'\0'结尾
- 模拟实现
size_t my_strlen(const char* string) { assert(string); size_t n = 0; while (*string++ != '\0') { n++; } return n; }
strcpy()
char *strcpy( char *strDestination, const char *strSource );
该函数的作用是将源字符串'\0'及其以前的字符拷贝到目标空间
- 源字符串必须以'\0'结束
- 返回值是目标空间的地址
- 目标空间必须可以修改
- 且目标空间要足够大,能够存储源字符串
- 模拟实现
char* my_strcmp(char* m, const char* source) { assert(source && m); char* ret = m; while (*m++ = *source++); return ret; }
strcat()
字符串追加:将源字符串'\0'以前的字符拷贝从目标空间的'\0'出开始进行拷贝,并返回目标空间的地址
char *strcat( char *strDestination, const char *strSource );
- 目标空间必须足够大
- 目标空间可修改
- 源字符串必须以'\0'结尾
- 模拟实现
char* my_strcat(char* m, const char* source) { char* ret = m; assert(m && source); while (*m++); m--; while (*m++ = *source++); return ret; }
strcmp()
字符串比较:比较两个字符串
int strcmp( const char *string1, const char *string2 );
- 模拟实现
int my_strcmp(const char* a, const char* b) { assert(a && b); while (*a == *b) { if (*a == '\0') return 0; a++; b++; } return *a - *b; }
strncpy()
char *strncpy( char *strDest, const char *strSource, size_t count );
当count大于源字符串中的字符时,会在源字符串拷贝到目标空间后,在其后面加'\0'直到达到count个字符
strncat()
char *strncat( char *strDest, const char *strSource, size_t count );
虽然strncat()除了会给目标空间追加count个字符,还会在追加的字符后面加上'\0'
- 当count大于源字符串的字符数时,不会在其后加'\0'使其追加到count个字符
strncmp()
int strncmp( const char *string1, const char *string2, size_t count );
比较两个字符串的前count个字符的大小
strstr()查找子串
char *strstr( const char *string1, const char *string2 );
- 能够找到子串则返回string2在string1的起始位置,找不到则返回空指针
- 模拟实现
char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); const char* s1 = str1; const char* s2 = str2; const char* p = s1; while (*p) { while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2) { s1++; s2++; } if (*s2 == '\0') return p; p++; s2 = str2; s1 = p; } return NULL; }
strtok()字符串分割
char *strtok( char *str, const char *sep );
- sep参数是个字符串,定义了用作分隔符的字符集合,例如:
char sep[]="@.*"
- 参数str表示待分割的字符串,包含0个或者多个sep中的分隔符分隔的标记
- strtok会改变被操作的字符串,因此一般使用临时拷贝的字符串进行切分
- strtok函数会找到str中的下一个标记,并将其改成'\0',并返回该字段的起始地址
- 如果不存在更多的标记,将返回NULL
- 当str不为NULL,strtok函数在找到下一个标记后,会保存它在字符串中的位置
- 当str为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标
记- 使用
int main() { char* a = "huangyu@xiong.xieyu*com"; const char* sep = "@.*"; char p[30]; strcpy(p, a);//将数据拷贝一份,处理a数组的内容 for (char*ret= strtok(p,sep); ret!= NULL; ret = strtok(NULL, sep)) { printf("%s\n", ret); } return 0; }
strerror()
- 返回错误码所对应的错误信息的指针
- errno C语言设置的一个全局的存放错误码的变量,始终会记录最新的错误码,需要使用头文件errno.h
- 使用:
printf("%s\n",strerror(errno));
二、字符分类函数
头文件 ctype.h 函数 如果他的参数符合下列条件就返回真(非零值) iscntrl 任何控制字符 isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' isdigit 十进制数字 0~9 isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F islower 小写字母a~z isupper 大写字母A~Z isalpha 字母a~z或A~Z isalnum 字母或者数字,a~z,A~Z,0~9 ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印) isgraph 任何图形字符 isprint 任何可打印字符,包括图形字符和空白字符
三、内存函数
memcpy() 内存拷贝
void *memcpy( void *dest, const void *src, size_t count );
- count表示的是拷贝对象的字节长度(byte)
- 负责拷贝两块独立空间中的数据,需要头文件 string.h
模拟实现
memmove
实现重叠内存之间的数据拷贝
void *memmove( void *dest, const void *src, size_t count );
- 同样需要string.h的头文件
- 模拟实现
void* my_memmove(void* dest, const void* src, size_t n) { assert(dest && src); char* ret = dest; if (dest > src) { while (n--) { *((char*)dest + n) = *((char*)src + n); } } else { while (n--) { *((char*)dest)++ = *((char*)src)++; } } return ret; }
memcmp
内存比较,需要头文件:<memory.h>or <string.h>
int memcmp( const void *buf1, const void *buf2, size_t count );
- count同样是需要比较元素总共的字节长度
- 返回值:若buf1大于buf2,则返回>0的数;若buf1小于buf2,则返回<0的数;两个相等,则返回0
- 使用:
int main() { int a1[] = { 1,2,3,4,5,6 }; int a2[] = { 1,2,3 }; printf("%d", memcmp(a1, a2, 12)); return 0; }
memset
- dest为待填充的内存块的指针,c为要填充的值,count为设置为c的字节数
void *memset( void *dest, int c, size_t count );
- 头文件:<memory.h>or <string.h>
- 注:在填充过程中,该函数会逐个字节进行填充,也就是每个字节都会填充上c;如下例所示,该函数并不能将数组中每个元素变为1,而是将每个元素的每个字节变为01
- 使用:这里使用字符是因为字符在传递过程中也是以ascll码值进行传递
int main() { char arr[] = "wanyeweiyuwenhaitang"; memset(arr, 'x', 5); printf("%s\n", arr); memset(arr, 'w', 5); printf("%s\n", arr); }