天天看点

strlen()实现

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

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

{

    assert( strt != NULL ); //断言字符串地址非0,3分

    int len;

    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 || *str=='\0')  

return 0;  

else  

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

}  

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

以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。  

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

继续阅读