实现一些有关c语言实现库函数

理解与使用库函数能够帮助我们更好理解别人是如何理解的优质代码,学习与借鉴一些别人优秀的方法。

小生不才,也来献丑。将自己所学的也给大家分享分享一下,

我们在学习c语言的时候当学习数组时候,当你遇见一个这样子代码char arr="hello  beautiful girl"

我想知道这个这个字符数组里面元素大小怎么办,当然了你也可以自己一个一个数,显然这个方法笨但也行,但是假如字符数组里面元素太多了,应该怎么办尼?

这时候就要借助于“好工具帮助我们解决这个问题”,没错这个东西——库函数

这个时候开始介绍这个这个strlen这个函数,当然想要使用这个函数需要头文件,这时候加上这个include<string.h>

那接下看一下这个函数的作用吧

不难看出来,细心朋友就会发现这个怎么是错误的,里面字符明明是只有18个怎么多出来两个,

这是因为这个strlen函数会把字符中的空格也给计入。

strlen函数原理是什么呢? 这就是利用到字符串的隐含条件——“\0”;

请看一下这串代码你就会明白strlen这个函数是怎么模拟实现的

size_t my_strlen3(const char* arr)
{
    size_t count = 0;
    while (*arr)
    {
        arr++;
        count++;
    }
    return count;
}
int main()
{
    const char* arr = "hello beautiful girl";
    size_t res = my_strlen(arr);
    printf("%zu\n", res);
    return 0;
}

当你看完之后是不是恍然大悟了吗?这时候总有人好奇size_t是什么,size_t是表示无符号整数的意思。const是修饰符号,在变量前面放这个const这样子这个变量的值就变成常量值了,不能改变;

这个时候我们来分析一下这个简单的函数,通过my_strlen接受arr的参数,进行while循环,这个时候就需要创建一个记录循环次数的变量,指针arr指向加一,然后判断while(*arr)的解引用arr是不是遇见“\0” 这个时候就有人好奇为什么不是写(*arr == "\0"),我这样子写是因为 (“\0”也是等于0,while遇见0就会退出循环,所以也可以这样子写,然后如此循环,遇见“\0”退出循环并返回变量count的值,用res接受count的值,并打印输出

当然了这个也可以用另外的方法实现,这个函数可以用递归的方法实现这个函数

size_t my_strlen1(const char* arr)
{
    //assert(arr != NULL);
    if (*arr == 0)
        return 0;
    else
        return 1 + my_strlen1(arr + 1);
}

通过这个简单的 if 判断就可以实现递归,就让我们分析一下这个递归吧

       +--------------------+    +------------------+
str -> |  '1'  |  '2'  |  '3'  |  '4' |  '5' |  '\0'  |
       +--------------------+    +------------------+
         |       |       |       |      |      |
         |       |       |       |      |      +--> my_strlen1("") = 0
         |       |       |       |      +--> my_strlen1("5") = 1 + 0 = 1
         |       |       |       +--> my_strlen1("45") = 1 + 1 = 2
         |       |       +--> my_strlen1("345") = 1 + 2 = 3
         |       +--> my_strlen1("2345") = 1 + 3 = 4
         +--> my_strlen1("12345") = 1 + 4 = 5

从这张图应该可以看出这个函数递归过程,递归就是从1到“\0”这个过程是递的过程,归是从“0”到1的过程,从这个“\0”到1的计算出不难看出了回归的过程;这是我对递归的理解,

希望这个文章对你们有帮助。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落花也难周

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

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

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

打赏作者

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

抵扣说明:

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

余额充值