一.对库函数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控制条件结束循环,从而导致死循环最终程序崩溃
运行结果如下: