自定义函数实现strlen()函数的功能 significant!

一个10分的strlen函数了,完美的版本为:

int strlen( const char *str ) //输入参数const,2分

{
    assert( str != NULL ); //断言字符串地址非0,3分
    int len = 0;
    while( (*str++) != '\0' ) // 3分
    {
        len++;
    }
    return len;
 }

 


不使用任何中间变量实现strlen  

int NoMallocStrlen(const char *str)

{

        if (str==NULL)

        {

                return 0;

        }

 

        if (*str != '/0')

        {

                return 1+NoMallocStrlen(++str);

        }

        else

                return 0;

}

 

int main()

        const char *p  = "hello!";

        int a = NoMallocStrlen(p);

 

        if(a == strlen(p))

        {

                printf("NoMallocStrlen is well done!/n");

        }

        else

        {

                printf("Error!/n");

        }

}


int my_strlen(const char*strDest)

{

    assert(NULL!=strDest);

    if(‘\0’==*strDest)

    {

        return 0;

    }

    else

    {

        return(1+my_strlen(++strDest));

    }

}

 




strlen的函数原形如下:

      size_t strlen(const char *str);

strlen返回str中字符的个数,其中str为一个以'\0'结尾的字符串(a null-terminated string)。

1. 简单实现
如果不管效率,最简单的实现只需要4行代码:

1 size_t strlen_a(const char * str) {
2     size_t length = 0 ;
3     while (*str++ )
4         ++ length;
5     return  length;
6 }

也许可以稍加改进如下:

1 size_t strlen_b(const char * str) {
2     const char *cp =  str;
3     while (*cp++ )
4          ;
5     return (cp - str - 1 );
6 }







下面几种实现strlen函数的源代码大家参考  

-------------------------------------------------1:start------------------------------------  

#include <stdio.h>  

#include <assert.h>  

typedef unsigned int u_int;  

u_int Mystrlen(const char *str)  

{  

u_int i;  

assert(str != NULL);  

for (i = 0; str[i]!= '\0'; i++);  

return i;  

}  

------------------------------------------------1:end--------------------------------------  


-------------------------------------------------2:start--------------------------------------  

int strlen(const char *str)  

{  

assert(str != NULL);  

int len = 0;  

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

len++;  

return len;  

}  

------------------------------------------------2:end ------------------------------------------  

------------------------------------------------3:start------------------------------------------  

int strlen(const char *str)  

{  

assert(str);  

const char *p = str;  

while(*p++!=NULL);  

return p - str - 1;  

}  

-------------------------------------------------3:end-----------------------------------------  


-------------------------------------------------4:start----------------------------------------  

int strlen(const char *str)  

{  

assert(str);  

if (*str==NULL)  

return 0;  

else  

return (1 + strlen(++str));  

}  

-----------------------------------------------4:end----------------------------------------  

以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。  其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以  调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值