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

本文详细介绍了C语言中的strcpy函数,包括其功能、使用注意事项,并提供了手动实现strcpy函数的示例代码。在手动实现中,强调了源字符串和目标空间的要求,以及如何确保正确拷贝字符串末尾的终止符。此外,还提供了一个优化版本的my_strcpy函数,增加了链式访问和错误检查功能,以提高代码效率和安全性。
摘要由CSDN通过智能技术生成

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

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值