模拟实现strcpy函数

函数简介

strcpy - string copy 函数 - 字符串拷贝

模拟实现strcpy函数_第1张图片

#include
#include

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello world";
	printf("%s\n", strcpy(arr1, arr2));
	return 0;
}

使用库函数可实现字符串拷贝,现模拟实现my_strcpy

字符串拷贝,本质上是字符拷贝+字符++

#include
void my_strcpy(char* des,char* src)
{
	while (*src != '\0')
	{
		*des = *src;
		*des++;//数组向后移动一位
		*src++;
	}
	*des = *src;//这里将'\0'进行拷贝
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[20] = "hello world";
	my_strcpy(arr1, arr2);//数组名就是数组首元素地址
	printf("%s\n",arr1);
	return 0;
}

这串代码还可以优化

#include
void my_strcpy(char* des,char* src)
{
	while (*des++ = *src++)//des src 解引用后自加1,自动跳到下一个字符,使代码简化
			{
				;//空语句
			}
}

int main()
{
	char arr1[20] = {0};
	char arr2[] = "hello world";
	my_strcpy(arr1, arr2);
	printf("%s\n",arr1);
	return 0;
}

这串代码已经可以实现字符串拷贝了,但它含有问题,如果字符串arr1为NULL空指针时,char* des 就为野指针了,这个程序就会有bug

为防止传递NULL指针,可以使用assert(link)函数进行断言处理

这里使用NULL测试下

#include
#include
void my_strcpy(char* des, char* src)
{
	assert(des != NULL);
	assert(src != NULL);
	while (*des++ = *src++)
	{
		;//空语句
	}
}

int main()
{
	char arr1 = NULL;
	char arr2[] = "hello world";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

模拟实现strcpy函数_第2张图片

为防止在模拟实现的过程中,des 与 src 表示不清而使程序出现失误,我们应该加const进行修饰

#include
#include
void my_strcpy(char* des,const char* src)
{
	assert(des != NULL);
	assert(src != NULL);
	while (*des++ = *src++)//这里写反时,由于const修饰,会报错
	{
		;//空语句
	}
}

int main()
{
	char arr1[20] = {1};
	char arr2[20] = "hello world";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 但编写函数时我们使用的是void函数,而cplusplus.com上提供了char*类型, 故代码还可以进行优化

最终版本:

#include
#include
char* my_strcpy(char* des, const char* src)
{
	assert(*des && *src);
	char* ret = des;//创建指针变量存放des 字符串
	while (*des++ = *src++)
	{
		;
	}
	return ret;//返回的是字符串数组的首元素地址
}
int main()
{

	char arr1[20];
	char arr2[] = "hello world";
	printf("%s\n", my_strcpy(arr1, arr2));//连式访问
                   //'\0'是字符串结束的标志,打印时遇到\0打印结束。
	return 0;
}

你可能感兴趣的:(C语言典例,c语言)