一.对库函数strcat的了解
通过在MSDN或者cplusplus网站上检索strcat
通过对strcat的检索,可以初步了解到strcat以下信息:
1.源头字符串不可被修
2.追加得源头字符串不能和目标重叠
3.追加得字符串来源不能来自目标字符串
4.返回类型是char* 目标地址
5.追加得字符串再目标数组中必须能存放下
6.目标地址得\0会被追加替代,追加后得字符串仍然包括\0
二.模拟实现库函数strcat
char* my_strcat(char* dest, const char* soc)
{
//记录目标地址起始位置
char* p = dest;
//寻找目标地址得\0位置,即追加得起始位置
while (*dest != '\0')
{
dest++;
}
//将soc得字符串追加至目标地址中
while (*dest++ = *soc++)
{
;
}
return p;
}
#include<stdio.h>
int main()
{
char arr1[50] = "abcd";
char arr2[50] = "efgh";
char* arr3 = my_strcat(arr1, arr2);
printf("%s", arr3);
return 0;
}
三.strcat的一些特殊情况
1.目标地址得\0会被追加替代,追加后得字符串仍然包括\0
通过调试以后可以发现:
strcat在实现时,虽然会将目标数组的\0替换,但是仍然会在结尾的时候给这个追加的数组补上\0
2.追加得源头字符串不能和目标重叠
下面通过画图来理解重叠的含义:
对于这种情况下,源头数据包含在目标数据内。
通过对上面的模拟实现代码的分析:
dest需要先找到\0的位置,然后再将(*dest++)=(*soc++)
对于判断条件while(*dest++ = *soc++),soc一直在向后移动,但是始终找不到\0的位置,无法控制条件停止,最终使程序死循环崩溃
运行结果如下:
另外一种情况:
这种情况下,目标数据包含在源头数据里。
通过对模拟实现strcat的代码分析:
同上述第一种情况一样,判断条件中的*soc始终无法找到\0控制条件结束循环,从而导致死循环最终程序崩溃
运行结果如下: