进阶C语言------>字符函数和字符串函数------strcpy函数

strcpy函数-----拷贝字符串到目标空间

//strcpy函数
//
//char* strcpy(char* destination, const char* source);
//
//拷贝一个字符串到另外一个空间
//
//注意点
//源字符串必须以\0结束
//会将源字符串中的\0拷贝到目标空间
//目标空间必须足够大,以确保能存放源字符串
//目标空间必须可变
//
//
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "abc  def";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

注意点中的最后一点:目标空间必须可变,要求目标空间里不能是常量字符串

例如: char* arr1 = "abcdefg";

arr1指向常量字符串,常量是不可被修改的

---------------------------------------------------------------

模拟实现strcpy函数

void my_strcpy(char* dest, const char* src)
{
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "wdjznb";

	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);

	
	//printf("%s\n",my_strcpy(arr1, arr2));//优化版本
	return 0;
}

简单解释一下思路:

1.返回值是void,不需要返回值,在形参char* src 前加了const,确保了源字符串不会被修改,提高了代码安全性。

2.用while循环遍历源字符串,每遍历一个字符就拷贝一个,然后地址++往后走,直到遇到'\0'为止,但是根据上述所说的注意点所知,strcpy会将源字符串中的'\0'拷贝到目标空间,所以当while遍历到'\0'后会跳出循环,此时src指向'\0'的位置,只要在使*dest=*src实现一遍,就可将'\0'拷贝到目标空间。

以下给出在此版本的基础上的优化版本


//优化
//把void改为char*,可以实现链式访问
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//避免空指针
	char* ret = dest;//循环完后可传回地址,实现链式访问
	while (*dest++ = *src++)
	{
		;
	 }
	return ret;
}

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "wdjznb";

	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);

	
	//printf("%s\n",my_strcpy(arr1, arr2));//优化版本,实现链式访问
	return 0;
}

该优化版本

1.返回值写成char*,使得函数能返回地址,从而在main函数中实现链式访问

2.assert断言,避免出现野指针的情况,提高代码的安全性

3.在while循环的条件边遍历边赋值,提高效率,减少代码冗余

4.为了能实现链式访问,创建了指针变量ret接收目标空间的地址

//int main()
//{
//	char arr1[20] = "hello\0";//arr2第一个字符会覆盖arr1的\0,同时arr2的\0也会追加过去
//	char arr2[] = " bit";
//	//strcat(arr1, arr2);//两个数组都必须有\0
//	my_strcat(arr1, arr2);
//
//	printf("%s\n", arr1);
//	return 0;
//}

你可能感兴趣的:(c语言)