C语言深度解析之四:关于C语言的字符串函数(一)(深信服面试)

今天来更新几个关于字符串的函数

1.strlen--求字符串长度

2.strcpy--长度不受限制的字符串函数,模拟实现

3.strcat--长度不受限制的字符串函数,模拟实现

4.strcmp--长度不受限制的字符串函数,模拟实现

5.strncpy,strncat,strncmp--长度受限制的字符串函数介绍

6.strstr--字符串查找

1.strlen

首先声明:size_t strlen ( const char * str );

这个函数的作用是统计‘\0’之前的字符个数,同时这个字符串必须要以‘\0’结束,函数的返回值为size_t,是无符号整型,这里要特别注意,看如下程序输出:

strlen有三种模拟实现的方法:

1.计数器方式:

2.不能创建临时变量,也就是使用递归的方法

3.通过指针减去指针的方法

 2.strcpy的模拟实现

这个函数的作用就是将一个字符串内容拷贝到另一个字符串中

直接上图 ,这个程序里面红框的都是优化之后的版本,

首先char*和ret对应,因为该函数返回值就是一个char类型的指针,且该指针指向目标地址的首字符地址。

其次就是const,保证源字符串不被修改。

还有断言部分的优化,不用写两个assert保证源和目标都不是空指针。

至于whlile循环体中的语句,因为要将源字符串中的内容包括\0全部copy到目标字符串中,所以当src指向的内容不等于\0时,就会一直赋值,当等于\0时,while判断到ASCII码值为0,所以跳出循环,正好将\0读完。

接下里就时printf函数中的链式访问,通过%s打印出目标地址所指向的内容。

这个strcpy还有非常重要的一点就是,他在深信服面试中出现过多次,问题是strcpy在使用过程中有什么缺陷?答案呢其实也非常简单,就是说strcpy在运行的时候,比较粗暴,他不管你其他内存是否已经占用,也就是并不检查目的缓冲区的大小边界,而是将源字符串逐一的全部赋值给目的字符串地址起始的一块连续的内存空间,同时加上字符串终止符,会可能导致其他变量被覆盖

3.strcat模拟实现

这里的源字符串必须以 '\0' 结束,原因是在读取源字符串的时候,要读到 '\0' 才能结束。

字符串不能自己给自己追加

首先将dest的首地址存起来准备作为返回值,接下来断言,之后先用while循环找到dest的\0之后的过程就和strcpy一样了

4. strcmp模拟实现

 5.strnpy,strncat,strncmp

5.1 strnpy

这个函数就是比strcpy多了一个指定的copy个数,需要注意的是,如果指定的copy个数大于了源字符串个数,会将\0补入目标字符串,如下图调试所示:

 5.2 strncat

这个函数也同样是指定了个数去在目标字符串后面追加源字符串内容,不过与上面不一样的是,即使指定了5,最后传过去就是4个。

 5.3strncmp

这个就更简单了,看一下就好

 6.strstr  字符串查找

先看strstr函数的基本使用方法

这个函数的作用是在str1中查找第一次出现str2的位置,不包含\0

再来模拟实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值