字符串函数

目录:

何为字符串函数???

                   在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循环怎么去解析呢?我在这里简单的解析一下

         这些函数都是关于字符串的函数,但并不代表只有这些,各位感兴趣可以自行去了解剩下的字符串函数

        那么关于我的字符串函数篇就介绍到这里,各位下一篇再见!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值