不调用库函数,模拟实现strcpy函数

//模拟实现strcpy函数
#include
#include


void My_Strcpy_1(char * des, char * src)
{
	while (*src != '\0')//将src里面'\0'之前的字符拷贝过去
	{
		*des = *src;
		des++;
		src++;
	}
	*des = *src;//拷贝'\0'到des
}


void My_Strcpy_2(char * des, char * src)
{
	while (*des++ = *src++)
	{
		;
	}
	//++的优先级高于*(解引用)
	//将src里面的第一个'\0'以及之前的字符拷贝过去
	//并且*des=='\0',条件为假,拷贝结束
}


void My_Strcpy_3(char * des, char * src)
{
	if (des == NULL || src == NULL)//用指针时要先判空
	{
		return;
	}
	while (*des++ = *src++)
	{
		;
	}
}


void My_Strcpy_4(char * des, char * src)
{
	assert(des != NULL);
	assert(src != NULL);
	//void assert (int expression);
	//断言 里面表达式为假时,报错,即des或着src有一个为空时,报错
	//assert 在Debug版本下起作用,在给用户的Release版本下自动优化消失
	while (*des++ = *src++)
	{
		;
	}
}


char * My_Strcpy_5(char * des, char * src)//完善返回类型
{
	assert(des != NULL);
	assert(src != NULL);
	char *p = des;
	while (*p++ = *src++)
	{
		;
	}
	return des;
}


char * My_Strcpy(char * des, const char * src)//保护源字符串
{
	assert(des != NULL);
	assert(src != NULL);
	char *p = des;
	while (*p++ = *src++)
	{
		;
	}
	return des;
}
//标准形式:
//char * strcpy ( char * destination, const char * source );

//const修饰指针类型时,若放在*的 左边,受保护是 指针所指的内容
//指针本身可以改变
//但指向的内容不能用指针改变,但可以用其他方式改变
//char const *p =NULL;   *p='a';//程序报错

//const修饰指针类型时,若放在*的 右边,受保护的是 指针
//指针指向的内容可以改变
//指针本身不可以修改
//char *const p=NULL;  p=ch2;//程序报错

int main()
{
	char ch1[20] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', '\0' };
	char ch2[20] = { 0 };
	/*My_Strcpy_1(ch2, ch1);*/
	/*My_Strcpy_2(ch2, ch1);*/
	/*My_Strcpy_3(ch2, ch1);*/
	/*My_Strcpy_4(ch2, ch1);*/
	/*My_Strcpy_5(ch2, ch1);*/
	My_Strcpy(ch2, ch1);
	//拷贝时将第一个'\0'拷贝过去后就结束
	printf("%s\n", ch2);
	return 0;
}

你可能感兴趣的:(c语言,函数,strcpy,模拟)