前言:
本次函数模拟运用到了assert以及const,如不熟悉请跳转👉这里学习后返回阅读。
首先,要先明白这个函数的作用,其次,通过某些网站去查看strcpy函数本身是怎么实现的,这里推荐c/cpp参考手册(访问较慢,站点在国外)或者关注公众号“源晨序”发送MSDN获取软件。
一、strcpy函数的模拟
strcpy:将一个字符数组的内容复制到另一个字符数组上
//strcpy(待拷贝数组,原始数组)
#include <string.h>
int main()
{
char arr[20] = { 0 };
char arr1[20] = "hello world";
strcpy(arr, arr1);
printf("%s", arr);
return 0;
}
模拟实现:
①简单思路版:
思路:找到原始数组的‘\0’,然后从头到尾移动到待拷贝数组中
//strcpy函数构造实现
void my_strcpy(char* dest, char* src)
{
char* tmp = src;
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src//最后将'/0'放入arr函数内
}
int main()
{
char arr[20] = { 0 };
char arr2[20] = "strcpy simulate";
//strcpy模拟
my_strcpy(arr, arr2);
printf("%s", arr);
return 0;
}
然而我只能说,当面试官给你出这题时,假设这题10分, 你这个答案顶天只能拿到5分,为什么怎么说?我们还没有去靠近strcpy它本身的写法,那怎么靠近呢?在刚刚推荐的网站或者软件上搜索strcpy,接下来带大家一起分析,写出最佳版本!
注意到,在刚刚的模拟中,我们缺少了这几部分,那就增加这部分内容,使得更加像strcpy本身!
②复刻版:
//高分strcpy函数构造实现
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
char *tmp = dest;
//使用指针前先判断,利用assert
assert(dest!=NULL);
assert(src!=NULL);
while (*src != '\0')
{
//更加简洁
*dest++=*src++;
}
//return dest? NO!,开头创建一个tmp存dest开始的地址
return tmp;//可以实现链式访问!
}
//my_strcpy函数设计返回值类型是为了实现函数链式访问;
int main()
{
char arr[20] = { 0 };
char arr2[20] = "strcpy simulate";
//strcpy模拟
my_strcpy(arr, arr2);
printf("%s", arr);
return 0;
}
此时的代码堪称<font color = “pink">完美~
几个加分点:
assert、const的使用使得函数更加接近strcpy自己本身。
二、strlen的模拟
有了strcpy的铺垫,这次可以一上来就看看strlen本身是如何实现,抓住重点不放。
size_t无非就是对unsigned int类型的重定义,我们视为int即可
int my_strlen(const char* string)
{
char* src = string;
while(*string!='\0')
{
string++;
}
return string-src;
}
int main()
{
char arr[30]="strlen simulate"
int len = my_strlen(arr);
printf("%d\n",strlen(arr));
printf("%d\n", len);
return 0;
}
结果如图:
总结:
当自己想要去更加真实的模拟一个函数,可以先在c/cpp参考手册或者软件上查找它到底是怎么构成的,这样不论是你想去写这样一个函数或者是对于这一个函数的理解都有非常大的作用