目录
前言:
一.字符串函数
1.strlen——求字符串长度
strlen
2.长度不受限制的字符串函数
a.strcpy——字符串拷贝
strcpy
b.strcat——追加字符串
strcat
c.strcmp——字符串比较
strcmp
3.长度受限制的字符串函数——strncpy,strncat,strncmp
为什么会出现这些函数呢?
strncpy函数:
strncpy
strncat函数
strncat
strncmp函数:
strncmp
4.字符串查找
a.strstr——判断是否为子字符串
strstr
b.strtok——一个奇怪的函数
strtok
c.strerror——错误信息查找
strerror
perror
上面是字符串相关的函数,下面是一些字符分类的函数:
编辑 字符转换函数:
二.内存函数
1.内存拷贝函数
a.memcpy
b.memmove
2.内存填充函数——memset
3.内存比较函数——memcmp
总结:
博客主页:张栩睿的博客主页
欢迎关注:点赞+收藏+留言
系列专栏:c语言学习
家人们写博客真的很花时间的,你们的点赞和关注对我真的很重要,希望各位路过的朋友们能多多点赞并关注我,我会随时互关的,欢迎你们的私信提问,也期待你们的转发!
希望大家关注我,你们将会看到更多精彩的内容!!!
前言:
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组中。 字符串常量 适用于那些对它不做修改的字符串函数。
以下的函数都需要引用头文件<string.h>
一.字符串函数
1.strlen——求字符串长度
strlen
函数原型:
函数作用:
字符串以'\0'作为结束标志,strlen函数返回值是在字符串中'\0'前面出现的字符个数(不包含'\0')
参数是一个字符指针变量
参数指向的字符串必须要以'\0'结束,否则计算出的长度是随机值
注意函数的返回值为size_t,是无符号的
函数注意事项:
因为返回值是size_t,所以就要避免出现下图这样的代码:strlen(“abc”)算出的结果是3, strlen("abcde")算出的结果是5,可能想着3-5得到-2,实际上并不是这样的,这里算出的3和5都是无符号整型,算出的-2也是一个无符号整型,-2在内存中以补码的形式存储,从无符号整型的视角看去,这串补码就表示一个很大的正数。
3种模拟的方法:
递归:
递归 int my_strlen1(const char* str) { assert(str != NULL); if (*str != '\0') return 1 + my_strlen(str + 1); else return 0; }
指针-指针
指针-指针 int my_strlen2(const char* str) { const char* start = str; assert(str != NULL); while (*str) { str++; } return str - start;
递推
int my_strlen(const char* str) { assert(str != NULL); int count = 0; while (*str != '\0') { count++; str++; } return count; }
2.长度不受限制的字符串函数
a.strcpy——字符串拷贝
strcpy
函数原型:
函数作用:
字符串拷贝函数,把源字符串拷贝到目标空间
注意事项:
函数有两个参数,source指向待拷贝的字符串,也叫做源字符串。destination是目标空间的地址
源字符串必须以’\0’结束
目标空间必须足够大,以确保能存放源字符串,否则会出现非法访问
特殊情况:
会把源字符串中的 ‘\0’ 也拷贝到目标空间
目标空间必须可变,例如把源字符串拷贝到一个字符串常量里面是不可取的
模拟实现:
char* my_strcpy(char* destination, const char* source) { assert(destination && source); char* ret = destination; while (*destination++ = *source++) { ; } return ret; }
b.strcat——追加字符串
strcat
函数原型:
函数作用:
字符串追加函数,将源字符串追加到目标字符串后面,目标中的终止字符’\0’会被源字符串的第一个字符覆盖
注意事项:
函数有两个参数,其中source指向要追加的字符串,也叫做源字符串,destination是目标空间的地址
目标空间中必须要有'\0',作为追加的起始地址
源字符串中也必须要有'\0'作为追加的结束标志
目标空间必须足够大,能容纳下源字符串的内容
目标空间必须可修改
以上与strcpy类似,但是有一点很特殊:
自己给自己追加会陷入死循环!
同学们先看看模拟实现的代码可以知道,该函数本质是将\0覆盖了,再最后追加\0,但是自己改自己会把\0覆盖不见,最后造成死循环。
模拟实现:
char* my_strcat(char* destination, const char* source) { assert(destination && source); char* ret = destination; while (*destination) { ret++; } while (*destination++ = *source++) { ; } return ret; }
c.strcmp——字符串比较
strcmp
函数原型:
函数作用:
根据相同位置的ASCII值进行大小的比较。并不是比字符串长度
注意事项:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
该函数是按字典序来比较的。
模拟实现:
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2)//如果相等就进去,两个指针加加,但是可能会出现两个字符串相等的情况,两个指针都指向'\0',此时比较就结束了 { if (*str1 == '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) { return 1; } else { return -1; } }