模拟实现库函数strlen

本文探讨了C语言中计算字符串长度的常见错误及其解决方案,包括使用指针迭代和递归方法实现strlen函数,并强调了对空指针的检查和常量数组的保护。此外,还提出了指针减指针的优化技巧,帮助读者深入理解C语言字符串操作。
摘要由CSDN通过智能技术生成

很多小伙伴可能会认为这也太容易了吧,这不是有手就行吗于是遍拿起电脑咔咔咔咔

写出了这样一段代码:

#include<stdio.h>

int main()

{

    char str[]="no gains";

    int count=0;

    while(*str++ !='\0')

 

    {

            count++;

    }

    printf("总共有%d个字符",count);

}

当小伙伴点击编译器运行的时候,编译器毫不留情的报错。这是小伙伴有点怀疑自己学了个假的c语言。其实这个错误的原因很简单:数组名是常量不能被修改

知道了这个原因之后稍作就行了:

 

#include<stdio.h>
int main()
{
    char str[]="no gains";
    int count=0;
    int i=0;
    while(*(str+i) !='\0')
    {
             i++;
            count++;
    }
    printf("总共有%d个字符",count);
}

    还有的小伙伴咔咔咔咔拿起电脑写出了这样一段代码并且自认为很完美:

int strlen(char*str)
{
    int count =0;
    while(*str!='\0')
    {
        count ++;
    }
    return count;
}

咔咔咔就结束了看起来挺完美的,其实这个代有很多的漏洞。

其一他并没有考虑到str为空指针的情况,其二就是我们只是要求字符串的长度并不会把他给修改在这里并没有把他给保护起来。

下面是我实现的代码

#include<assert.h>
int my_strlen(const char*str)//const 修饰保护str指向的字符串的内容不能被修改
{
    assert(str!=NULL);//断言防止str为空指针
    int count=0;
    while(*str!='\0')
    {
        count++;
    }
    return count;
}

其实实现这个函数不止这一种方法在以后的面试中可能面试官会出这样一道题:不使用临时变量模拟实现strlen这个函数可能有点小懵,其实也很简单。运用的思想主要是递归下面让我们来看如何不使用临时变量实现strlen这个函数

#include<assert.h>
#include<stdio.h>
int my_strlen(const char*str)//const 修饰保护str指向的字符串的内容不能被修改
{
    assert(str!=NULL);//指针断言防止str为空指针
    if(*str!='\0')
    {
      return 1+my_strlen(++str);
    }
    else//如果为空字符串直接返回0
    {
        return 0;
    }
}
    int main()
    {
        char arr[]="fnnnc";
        int len=my_strlen(arr);
        printf("%d",len);//打印字符串长度
    }

运用递归的方法就可以把他完美的解决了

其实实现这个函数还有一个方法那就是指针减指针让我们来看看这种解决方法吧

 

#include<assert.h>
#include<stdio.h>
int my_strlen(const char*str)//const 修饰保护str指向的字符串的内容不能被修改
{
    assert(str!=NULL);//断言防止str为空指针
    char*start=str;
    char*end=str;
    while(*end!='\0')
    {
        end++;//指针向后移动
    }
    return end-start;
}
    int main()
    {
        char arr[]="fnnnc";
        int len=my_strlen(arr);
        printf("%d",len);//打印字符串长度
    }

这样我们就再一次实现这个函数通过这希望对各位小伙伴有帮助通过这也告让我们明白在学习的过程中要虚心要扎实。喜欢的小伙伴点个赞!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个追梦的少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值