一步一步教你模拟实现strcpy、strcat及用法

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;
}

一步一步教你模拟实现strcpy、strcat及用法
输出的结果为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字符。
一步一步教你模拟实现strcpy、strcat及用法
接下来,我们来模拟实现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;
}
上一篇:SysUtils.StrCat


下一篇:单例模式--java代码实现