前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用。 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这两个库函数的使用。
目录
- 1.strlen的模拟:
- 2.strcpy的模拟:
1.strlen的模拟:
首先我们要了解strlen这个库函数的使用方法,如图:
由图可知,strlen库函数的返回类型是无符号整型 (写成size_t 也等价于 unsigned int), 函数参数是
传进来的字符串数组地址 char* ,防止被更改,用const赋予常属性。
讲解:模拟函数 my_strlen返回类型也可以写成int ,因为长度非负数,这里我们就以int作为返回类型,注意增加断言,防止传入空指针而报错,具体实现参考如下代码。
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
assert(arr); // 断言 arr不是空指针NULL ,否则报错
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
2.strcpy的模拟:
首先我们要了解strcpy这个库函数的使用方法,如图:
由图可知,这个库函数的返回类型是char*,前面参数是目的地地址char*,后面是源头地址char*,注意源头不能被读写,因此const赋予常属性。
讲解:这里我们要将数组arr1的内容复制到数组arr2中,arr2的大小要注意,要足够大,否则就会出现数组越界报错。用 char* 指针 ret接收目的地址(dest->arr2),
注意使用 assert 断言,防止传参进来的是空指针 NULL而报错,其他讲解的点在代码中以注释形式给出,请大家注意查看。
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(src != NULL); //断言 增加代码健壮性和鲁棒性
assert(dest!=NULL);
char* ret = dest; // 复制前,记录目的地地址(接下来会被更改),用于打印
while (*dest++ = *src++)//后置++,先使用(复制内容),再++
{
; //相关操作已在括号中给出,所以这里书写空语句
}
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[100] = "a";
char* ret= my_strcpy(arr2,arr1); // arr1是源头,arr2是目的地,把arr1的内容放到arr2里面
printf("%s\n", ret);
return 0;
}
总结:我们可以以模拟各个库函数的使用来加深对库函数的理解与代码书写能力,这对学习各个库函数是十分重要的,大家可以参考上面模拟的两个库函数来对其他库函数进行模拟,熟练库函数的使用。
如果觉得文章对自己有所帮助,欢迎大家点赞收藏~ 谢谢大家的阅读,我们下期再见!