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

函数头文件#include<string.h>

注意点

1.源字符串必须以'\0'结束

2.目标空间足够大

3.目标空间可修改

//strcat函数

//char* strcat(char* destination, const char* source);
#include<string.h>
int main()
{
	char arr1[20] = "WDJ\0xxxxxxxxx";//arr2第一个字符会覆盖arr1的\0,同时arr2的\0也会追加过去
	char arr2[] = "NB";

	printf("%s\n", strcat(arr1, arr2));//两个数组都必须有\0


	return 0;
}

上述代码中的两段注释是strcat函数的细节点

下面用例子解释第一段注释:

图1

 

                                                                             图2

图1是调试后所观察到两个数组的具体内容

图2是调用strcat后目标空间的变化,很明显,arr2的首元素N直接覆盖了arr1的'\0';同时自己的'\0'也会拷贝过去

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

模拟实现strcat函数

//模拟实现strcat函数

char* my_strcat(char* dest, const char* src)//const增加代码鲁棒性
{
	assert(dest != NULL);
	assert(src != NULL);//assert断言避免出现空指针

	char* ret = dest;//创建指针变量接收dest为了后期返回dest的地址从而实现链式访问

	while (*dest)//*dest开始指向首元素地址,慢慢往后遍历,0为假跳出循环
	{
		dest++;//遍历目标空间的字符,直到遇到'\0',跳出循环,此时dest指向'\0'的地址
	}
	while (*dest++ = *src++)//接着从'\0'开始往后拷贝
	{
		;
	}
	return ret;//返回dest的首地址
}

int main()
{
	char arr1[20] = "HA";
	char arr2[] = "PPY";

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

	return 0;
}

解释参考代码注释

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

问题:字符串自己给自己追加,如何?

char* my_strcat(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	//找目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return dest;
}

int main()
{
	char arr[20] = "bit";
	//char arr2[] = "aa";
	my_strcat(arr, arr);//自己追加自己,err两个数组都必须有\0

	printf("%s\n", arr);
	return 0;
}

 当我们运用自己的my_strcat使得字符串自己追加自己时,程序会崩

原因:

//两个参数都指向同一个地址,即bit中b的地址,调用我们自己的my_strcat,第一个while条  件的dest遍历到bit后面的'\0'会跳出循环,此时的dest指向'\0'


    //接下来进入第二个while循环,此时此刻src指向bit的b的地址,所以会将b赋给'\0',接着往下拷贝,按理说会遇到src的'\0'从而停止第二个while,完成追加


    //但是src指向的还是bit这个字符串,bit的'\0'早已被赋值成b,因此不会再遇到'\0',所以第二个while也不会终止,最后程序自己崩了

//------------------------------------------------------------------------

模拟实现my_strcat会出现上述情况,但是库函数strcat中自己追加自己程序却不会崩溃

 

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值