理解与使用库函数能够帮助我们更好理解别人是如何理解的优质代码,学习与借鉴一些别人优秀的方法。
小生不才,也来献丑。将自己所学的也给大家分享分享一下,
我们在学习c语言的时候当学习数组时候,当你遇见一个这样子代码char arr="hello beautiful girl"
我想知道这个这个字符数组里面元素大小怎么办,当然了你也可以自己一个一个数,显然这个方法笨但也行,但是假如字符数组里面元素太多了,应该怎么办尼?
这时候就要借助于“好工具帮助我们解决这个问题”,没错这个东西——库函数
这个时候开始介绍这个这个strlen这个函数,当然想要使用这个函数需要头文件,这时候加上这个include<string.h>
那接下看一下这个函数的作用吧
不难看出来,细心朋友就会发现这个怎么是错误的,里面字符明明是只有18个怎么多出来两个,
这是因为这个strlen函数会把字符中的空格也给计入。
strlen函数原理是什么呢? 这就是利用到字符串的隐含条件——“\0”;
请看一下这串代码你就会明白strlen这个函数是怎么模拟实现的
size_t my_strlen3(const char* arr)
{
size_t count = 0;
while (*arr)
{
arr++;
count++;
}
return count;
}
int main()
{
const char* arr = "hello beautiful girl";
size_t res = my_strlen(arr);
printf("%zu\n", res);
return 0;
}
当你看完之后是不是恍然大悟了吗?这时候总有人好奇size_t是什么,size_t是表示无符号整数的意思。const是修饰符号,在变量前面放这个const这样子这个变量的值就变成常量值了,不能改变;
这个时候我们来分析一下这个简单的函数,通过my_strlen接受arr的参数,进行while循环,这个时候就需要创建一个记录循环次数的变量,指针arr指向加一,然后判断while(*arr)的解引用arr是不是遇见“\0” 这个时候就有人好奇为什么不是写(*arr == "\0"),我这样子写是因为 (“\0”也是等于0,while遇见0就会退出循环,所以也可以这样子写,然后如此循环,遇见“\0”退出循环并返回变量count的值,用res接受count的值,并打印输出
当然了这个也可以用另外的方法实现,这个函数可以用递归的方法实现这个函数
size_t my_strlen1(const char* arr)
{
//assert(arr != NULL);
if (*arr == 0)
return 0;
else
return 1 + my_strlen1(arr + 1);
}
通过这个简单的 if 判断就可以实现递归,就让我们分析一下这个递归吧
+--------------------+ +------------------+
str -> | '1' | '2' | '3' | '4' | '5' | '\0' |
+--------------------+ +------------------+
| | | | | |
| | | | | +--> my_strlen1("") = 0
| | | | +--> my_strlen1("5") = 1 + 0 = 1
| | | +--> my_strlen1("45") = 1 + 1 = 2
| | +--> my_strlen1("345") = 1 + 2 = 3
| +--> my_strlen1("2345") = 1 + 3 = 4
+--> my_strlen1("12345") = 1 + 4 = 5
从这张图应该可以看出这个函数递归过程,递归就是从1到“\0”这个过程是递的过程,归是从“0”到1的过程,从这个“\0”到1的计算出不难看出了回归的过程;这是我对递归的理解,
希望这个文章对你们有帮助。