C语言库函数:手把手教你用三种方法模拟实现strlen函数-创新互联

前言

前面我们学习了strlen函数的基本使用,我们知道,strlen函数是用于计算字符串长度的函数,而字符串以 ‘\0’ 作为结束标志,这要求strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数,不包含 ‘\0’。又因为字符个数一定是正整数,所有strlen函数的返回类型应该是无符号整型,而在C语言里又被宏定义为size_t。

创新互联是一家专业提供盐都企业网站建设,专注与成都网站设计、成都网站制作、HTML5建站、小程序制作等业务。10年已为盐都众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

有了以上知识基础,我们就可以自己模拟实现一个my_strlen函数。接下来我会手把手地教你用三种方法,巧妙地实现该函数的功能。


模拟实现

所谓知己知彼才能百战不殆,要想自己模拟实现strlen函数,就得先了解strlen函数的函数原型,如下所示:

size_t strlen ( const char * str );

我们不难发现,strlen函数的形式参数类型是一个const修饰的字符指针,也就是我们要计算的字符串的地址。

于是我们就有了自己要模拟实现的函数的函数原型:

size_t my_strlen ( const char * str );

既然是计算字符串长度,那么第一个想到的便是对字符串里的字符一个一个进行计数,下面就有了我们的第一种方法:

计数器法
size_t strlen ( const char * str )
{
    unsigned int count = 0;
    while(*str)
    {
        count++;
        str++;
    }
    return count;
}

该方法先声明了一个用于计数的变量count,然后利用循环进行计数。

循环的判断条件是对字符串中字符的地址的解引用,我们知道在C语言中0为假,非0为真,而字符在计算机内部以ASCII码形式存储,且字符串结尾的标志’\0’对应的ASCII码值刚好就是0。

所以该循环从字符串第一个元素开始计数,计数每加一,指向的字符也向后挪一位,直至到字符串结尾’\0’,循环条件判断为假,结束循环。

最后返回变量count的值,即为字符串的长度。

是不是非常简单?但是,如果规定不能创建临时变量count用于计数,你还能实现这个函数吗?

下面教你用递归的思想巧妙解决:

递归法(不创建临时变量的方法)
size_t strlen ( const char * str )
{
    if(*str == '\0')
        return 0;
    else
        return 1+my_strlen(str+1);
}

这种方法使用了一条if-else语句,如果遇到'\0',也就是字符串结尾标志,则return 0;否则就表示字符串未结束,故返回1+my_strlen(str+1),即计数加1并且再次调用my_strlen函数,只不过这次调用函数的参数是下一个字符的地址。

这就是递归的思想,当最后一次调用函数时,就是遇到了字符串结尾标志'\0',此时return 0,返回至上一次调用,而上一次函数执行时通过判断if条件为真,再次返回至上一级。如此循环往复,最终返回main函数后,返回的值就是字符串的长度。

看到这里,相信你已经拍手叫好。但是别急,我们还有另外一种方法:

利用指针相减
size_t strlen ( const char * s )
{
   char *p = s;
   while(*p != ‘\0’ )
       p++;
   return p-s;
}

仔细观察,你会发现,我们先创建了一个指针p保存了传入函数的地址s,也就是最开始的字符的地址。接着,我们利用循环,让指针p遍历字符串,直到p指向字符串结束标志'\0'停止。此时,函数计算并返回指针p与指针s的差值,即为字符串的长度。


结语

怎么样,是不是每种方法都非常优雅且巧妙。感谢阅读,也希望大家能有所收获,我们共同进步。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:C语言库函数:手把手教你用三种方法模拟实现strlen函数-创新互联
当前地址:http://myzitong.com/article/ccgooi.html