
各位看官们,你们好呀,简单自我介绍一下,我是一名初学C语言的小白,学C语言完全是出于热爱,所以,我的个性签名也是这句话:热爱可抵岁月漫长。当然啦,这也是我的座右铭,希望各位看官们也会执着追求自己所热爱的东西,为爱奋斗。
好了,咱们废话不多说,直入主题。
一、你真的了解C语言中字符串长度了吗?
相信很多初学C语言的朋友都知道怎么使用strlen库函数,那这个strlen到底是怎么一回事呢,还请让我给您细细道来......
通过学习我们知道,每个字符串都有它的结束标志,即'',比如:char arr[] = "abc",在内存中存储时是这样子的,a b c ,如下图所示:
从图片中可以明显看到(这里有一些VS里面调试的小技巧哦,看官们不了解的话我可以单独写一期有关VS调试的博客,我们来共同学习,一起进步),char所开辟的内存空间中,数组从下标0开始依次到下标4,分别存'a''b''c'''。我们先用strlen库函数编译一下,发现字符串“abc”的长度是3,这也就是说,''仅是一个虚拟存在的判断标志,求字符串长度时并不会计算其中。也就是我刚刚给您说的本段第一句话:每个字符串的结束标志是''。当我们了解完这个知识后,对于怎么求一个字符串长度,就变得很简单了。好的,理论存在,实践开始!
二、有几种方法可以实现呢?
方法1:最基础的while循环实现
在上面的代码中,我们用到的知识主要是while语句。我们知道, 数组的数组名是它首元素的地址,所以在my_strlen()中传参可以是char *str,*str是解引用后的数组内容,str是地址。while语句中的判断条件是*str!='',即满足这个条件时会执行count++和str++语句,直到不满足该条件,跳出循环,然后返回count值,count值就是所求字符串的长度。不知道这个方法您看懂没有呢?
方法2:用函数递归的方法来实现
在上面的代码中,我们使用了函数递归和if条件判断语句,可以明显看出来啊,代码是不是更加高大上了呢?我作为过来人,知道初学者对函数递归很难理解,但我相信,看完下面这张图,你对递归会有全新的认识。
您看,程序从main函数出发,当遇到第一个my_strlen函数时,开始调用该函数,经过四次调用和四次递归,返回值就是字符串长度,递归过程您看看上图就秒懂了。如何,一个strlen函数的递归方法实现,是不是既对C语言中递归的过程和思想有了了解,而且对嵌套其中的if语句的使用更加熟练。接下来,我们来看看第三种方法。
方法3:用指针相减的方法实现
使用这个方法之前呢,我们需要先了解一下这样一个规定——指针和指针相减,指针减指针得到的值是两个指针之间的元素个数,这样一来,怎么求字符串长度信手拈来,感觉这个规定的创造就是为了求字符串长度。于是,用最终++后的str减去start,就是所求字符串的元素个数,也就是字符串的长度。
方法4:使用const和assert对第三个方法进行优化
①assert:断言语句,可以理解为一个报错语句。assert()语句对于我们C语言初学者很有用,它可以说是一个专门调试程序时用的宏,在程序运行时计算括号内的表达式,若表达式为假 (即值为0), 程序将报告错误,并终止执行,同时也便于查找错误。如果表达式为真,则继续执行后面的语句。所以,如果程序没有error,assert就相当于不存在。还有,assert只有在 debug 版本中才有效,如果为 release 版本则直接被忽略。使用时要#include。
②const:const的基础用法有三种。
其一,const修饰指针变量,如int * const p=&num,const放在*的右边,修饰的是指针变量p,表示指针变量p不能被改变,但是指针指向的内容*p可以被改变;
其二,const修饰指针指向的内容,如const int * p=&num,const放在*的左边,修饰的是*p,表示指针指向的内容*p不能被改变,但是指针变量p是可以被修改的;
其三,const修饰常量,如,const int num = 10; num =20;这样是个error。
③因为我们需要计算字符串的长度,所以定义的函数返回值肯定是正整数,需要无符号整型,在C语言中,size_t就相当于unsigned int型。
了解了这三个知识点后,现在给您看看优化后的代码:
这个代码中,使用const控制*str和*start无法改变,但str和start还可以变化(const后能够增加代码的”健壮性“)。while语句内的*start只是在++运算,用来判断''在哪,并没有改变*start所指的内容。在本例中,my_strlen返回值是start-str-1=3;
在下不才,目前也就只总结了上面这几种求字符串长度的方法,但是计算机语言非常灵活,只要是你学的够多,理解的够透彻,我相信肯定还会有无数种其它更简洁、性能更好的方法。
以上便是本期的主要内容了,不知道看官们读完后有没有耳目一新呢,欢迎在评论区留言,让我们互相监督互相学习!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)