目录:
何为字符串函数???
在C语言中,提供了一系列的函数,用来对字符串进行操作,比如:求字符串个数(strlen) ,字符串拷贝(strcpy),字符串追加(strcat)等等一系列的函数,这些函数便称之为字符串函数。
字符串相关的函数都要包括头文件<string.h>
注 : 字符串函数只针对字符串
1. strlen函数的使用和模拟实现
1.1 strlen函数的使用
图中是strlen函数的参数和返回值
. 用来求字符串长度的函数
. strlen遇到‘\0’便会停止计算,并返回‘\0’之前的字符串个数
.字符中有'\0'也会直接停止
我们了解完strlen函数后,接下来就是如何对strlen进行模拟实现。
1.2 strlen函数的模拟实现
strlen的模拟实现有很多种,我们来实现最简单的一种,用计数器来实现strlen
2. strcpy函数的使用和模拟实现
图中是strcpy函数的参数和返回值,dest是目的地,src是源头,strcpy函数就是把源头复制到目的地里。
2.1 strcpy函数的使用
。strcpy函数就是把一个数组里面的字符,拷贝到另外一个数组里面
。源字符串必须以'\0'结束
。会将‘\0’拷贝到目标空间
。目标空间必须够大(会导致越界)
。目标空间必须可修改,不能为常量
错误示范
2.2 strcpy的模拟实现
怎么去实现strcpy函数呢?先画图来分析一下
上代码;
我们可以看到,在代码中,使用了char * ret 来接收dest的首地址,并且返回了ret ,这是为什么呢?
这是因为函数要求返回的是dest的起始地址,但dest在被赋值的同时一直在++,等到赋值完之后dest已经来到了后面,所以用ret来存dest的初始地址,最后返回ret。
输出结果为:
3. strcat函数的使用和模拟实现
strcat函数的参数和返回值跟strcpy相同
3.1 strcat函数的使用
。strcar函数用于追加字符串,把一个字符串追加到另一个字符串后面
。源字符串必须以‘\0’结束
。目标字符串也得有'\0',否则没办法知道字符从哪里追加
。目标空间必须够大(防止越界)
。目标空间必须可修改(不能为常量)
3.2 strcat的模拟实现
所以我们需要用到两个循环
。1个循环找\0
。1个循环用来追加
上代码:
4. strcmp函数的使用和模拟实现
因为返回值中包括负数,所以要用有符号的int来接收,而不是size_t;
4.1 strcmp的模拟实现
。strcmp函数是比较两个字符串的大小
。比较的是两个字符串的ASCII码值
图中字符串对比,c的ASCII码值比q小,所以arr2 大于 arr1;
这里我们可以看到,返回的分别是 1 , 0 , -1 ,而这返回的值是由编译器决定的有的可能是其他随机数。
4.2 strcmp函数的模拟实现
上代码:
还可以优化一下:
优化后返回的就不是1 跟 -1 了,而是ASCII码值相减后的数字
5. strncpy函数的使用和模拟实现
strncpy函数比strcpy函数多一个参数
5.1 strncpy函数的使用
。strncpy函数可以指定要复制的字符串个数
。不会复制'\0’
。目标空间必须够大
。目标空间必须可修改
这里我们看到复制了5个,如果说源字符串只有10个,而我在参数那给了12的话会发生什么???
我们先给arr2 初始化成13个‘x’,好方便观察
让我们调试看看
通过观察我们发现,当字符串个数没有满足我所想要的个数时,strncpy函数会补上‘\0’,直到满足为止。
5.2 strncpy的模拟实现
strncpy函数的实现逻辑和strcpy函数的基本一致,所以直接上代码!
6. strncat函数的使用和模拟实现
strncat函数比strcat函数多一个参数
6.1strncat函数的使用
。strnat函数可以指定要追加的字符串个数
。会从字符串的结尾(‘\0’)处开始追加
。当你要追加的字符串数量不满足要求的数量时,它会把字符串全部追加完,然后不会补'\0'
。目标空间必须足够大
。目标空间必须可修改
6.2 strncat函数的模拟实现
实现逻辑跟strcat函数基本一致,所以直接上代码:
7. strstr函数的使用和模拟实现
图中是它的参数和返回值;
7.1strstr函数的使用
。strstr函数的作用是在一个字符串里面查找另一个字符串
。字符串的比较匹配不包含‘\0’,以'\0'作为结束标志
。函数返回的是字符串str2在str1中第一次出现的位置,如果找不到返回空指针(NULL)
什么意思呢?
这是两个字符串
所以输出结果应该是“is is an apple”,而不是“is an apple”,对不对呢?让我们上代码看一下:
输出结果:
7.2 strstr函数的模拟实现
这里解析起来,会很难讲清,我个人推荐搜一下视频解析,所以我这里就不给大家解析了,各位可以自行调试和了解
8.strtok函数
图中是strtok函数的参数和返回类型
8.1 strtok函数的使用
。strtok函数用于字符串中的下一个记号,我个人更倾向于认为用于切割字符串
。找到要排查的符号,并把他改成\0,然后给上个记号,下一次就从这个记号开始向后走,而不是从前面
值得注意的是,strtok函数在传参时,往往需要传两三次或者更多,但第一次的传参和后面的传参会有点差异,那我们怎么去传参呢?
。第一次传参 strtok(字符串,要排查的符号)
。第二到第n次传参 strtok(NULL , 要排查的符号)
这里我们可以看到后面的传参传了个NULL,这是为什么呢?
这是因为第一次传参是我们传过去起始地址,从起始地址开始查找,找到后返回前面的字符串,并给上一个记号,让我们下次从记号处继续向后排查,但这里如果我们再给上起始地址,就不会从记号处往后查找了,怎么办呢?没错,就是空指针(NULL),当第二次传参传过去空指针(NULL),就会从记号处继续查找,所以?上代码!!!
但有一点需要注意,因为排查后要把排查到的符号改成\0,所以这个函数时会改变源字符串的
这里我们看到确实全部排查出来了,但这串代码很冗余,发现没有?如果说我的字符串很长,我想全部排查完,我难道还得一个一个打出来吗?那这样就没有敲代码的必要了
那又没有办法解决呢?答案是肯定的
这串代码中我们用for循环来解决刚刚代码冗余的问题,这个for循环怎么去解析呢?我在这里简单的解析一下
这些函数都是关于字符串的函数,但并不代表只有这些,各位感兴趣可以自行去了解剩下的字符串函数
那么关于我的字符串函数篇就介绍到这里,各位下一篇再见!!!