模拟实现strcpy函数

模拟实现strcpy函数,第1张

模拟实现strcpy函数

函数简介

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

#include
#include

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

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

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

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

int main()
{
	char arr1[20] = { 0 };
	char arr2[20] = "hello world";
	my_strcpy(arr1, arr2);//数组名就是数组首元素地址
	printf("%sn",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("%sn",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("%sn", arr1);
	return 0;
}

为防止在模拟实现的过程中,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("%sn", 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("%sn", my_strcpy(arr1, arr2));//连式访问
                   //''是字符串结束的标志,打印时遇到打印结束。
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5594191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存