重新拾起C语言,因为我的懒惰竟然这么多天没有学习,从今天开始我要拿出真本事了。
strlen这个函数想必大家都很熟悉了吧,那么我们要怎么用自己的代码将strlen给实现呢?
首先我们先要把strlen函数的功能搞清楚——计算字符串的长度,比如“abcdef”的长度就是6
下面我们先用strlen来计算“abcdef”的长度
#include <stdio.h>
#include <string.h>
int main()
{
char ch[] = "abcdef";//注意添加""
int a = strlen(ch);//strlen函数要添加头文件<string.h>
printf("%d\n", a);
return 0;
}
不知道为什么,图片上传失败。该代码是可以正常运行的,结果为6.
那么接下来我要介绍多种strlen函数的模拟实现。
方法一(计算器方式)
设置一个变量count每次循环后count++。
这里我们将之间编写的strlen函数名为my_strlen。
#include <stdio.h>
int my_strlen(char* str)//
{
int count;//计数器设置
count = 0;
while (*str)
{
str++;
count++;//每次循环计数器加一,最后遍历完数组就恰恰为字符个数。
}
return count;//返回count值到主函数中。
}
int main()
{
char ch1[] = "abcdef";
int ret = my_strlen(ch1);//命名自己的strlen函数
printf("%d\n", ret);
return 0;
}
图片上传失败了,这个代码也是可以正常运行的,结果为6.
既然要追求自己的函数,那就贯彻到底。
下边我们来完善这个代码。
完善的代码就如下面所示
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)//使用const(常量)使得*str不能被随便修改,提高了程序的安全性
{
assert(str);//使用assert(断言)预防str为空指针
int count;//计数器设置
count = 0;
while (*str)
{
str++;
count++;//每次循环计数器加一,最后遍历完数组就恰恰为字符个数。
}
return count;//返回count值到主函数中。
}
int main()
{
char ch1[] = "abcdef";
int ret = my_strlen(ch1);//命名自己的strlen函数
printf("%d\n", ret);
return 0;
}
主要改动为函数方面的改动,const 和assert的使用。
方法二(指针减指针)
我们都知道指针减指针求得的为之间元素的的个数,那么我们就可以利用这个特性来实现strlen的模拟实现。
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)//使用const(常量)使得*str不能被随便修改,提高了程序的安全性
{
assert(str);//使用assert(断言)预防str为空指针
char* p = str;//将数组的首元素的地址交给p以代替str
while (*p != '\0')//当p等于‘\0’时p已经是数组最后一个元素的地址了
{
p++;
}
return p - str;//尾元素地址与首元素的地址相减得到的就是整个字符串的字符个数
}
int main()
{
char ch1[] = "abcdef";
int ret = my_strlen(ch1);//命名自己的strlen函数
printf("%d\n", ret);
return 0;
}
这就指针的运用(虽然我学的不是很好就是了)
方法三(递归方法)
运用递归的性质将大事化小。
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
这个不解释了,才…才不是我不会解释呢…哼!
那么本次的教学到处结束,喜欢的话可以关注我,我们一起成长