1.前言
strcpy和strlen是我们在c语言中经常用到的两个库函数,今天我来教大家怎样去模拟实现这两个函数,那有人会问,为什么要去模拟实现这两个函数呢?答案是当我们去模拟实现函数时,我们能够对这个函数有一个更好的理解,比如,当我们模拟实现函数后,我们能够知道这个函数的内部实现的过程,以及应该传什么参数,和这个函数返回什么类型,以至于加深对这个函数的印象。
2.strcpy(复制一个字符串)
strcpy的基本概括如下:
char *strcpy( char strDestination, const char strSource ),很多人会以为strcpy的使用是将整个字符串传进去,但我们可以看到strcpy传进去的参数是两个char的地址,返回类型也是char,strcpy函数的作用是:将strSource(包括结束符null)复制到strDestination指定的位置。如果你觉得概念太模糊了,那么我们来看一个例子:
#include<stdio.h>
#include<string.h>
int main()
{
char str[80];
strcpy(str, "hello ");
strcpy(str, "world");
printf("%s\n", str);
return 0;
}
输出的结果为world,可见strcpy把hello给覆盖掉了
那么,我们来模拟实现strcpy
char* my_strcpy(char* pa,const char *pc)
{
assert(pa&&pc);
//若pa和pc为空指针,程序会报错,可以保护程序
while (*pc != '\0')
{
*pa = *pc;
pa++;
pc++;
}
*pa = '\0';
return pa;
}
int main()
{
char str[80];
my_strcpy(str, "hello world");
//数字名表示的是首元素的地址,hello world传进去的也是首元素的地址
printf("%s\n", str);
return 0;
}
还有更简洁的代码是`
char* my_strcpy(char* pa,const char *pc)
{
assert(pa&&pc);
while (*pa++ = *pc++)
//因为为后置++,所以先赋值,后++,最后才判断,当遇到\0时,判断条件为假,循环结束
{
}
return pa;
}
int main()
{
char str[80];
my_strcpy(str, "hello world");
printf("%s\n", str);
return 0;
}
strcat(连接一个字符串)
char *strcat( char strDestination, const char strSource );同样,参数为两个char的指针,返回类型为char的指针,函数的作用是:将strSource追加到strDestination,并以空字符结束结果字符串。strSource的初始字符覆盖了strDestination的结束null字符。
接下来,我们来模拟实现strcat
char* my_strcat(char * pa, const char* pc)
{
//先找到str数组的\0
while(*pa != '\0')
{
pa++;
}
//然后在\0处进行赋值
while (*pa++ = *pc++)
{
}
return pa;
}
int main()
{
char str[80] = "hello ";
my_strcat(str, "world");
printf("%s\n", str);
return 0;
}