1、strcat函数的各个参数介绍
char* strcat(char* destination,const char* source)
①函数名为strcat
②返回值类型为char*,是目标空间的起始地址
③函数的参数,第一个是目标空间的起始地址,第二个是源字符串的起始地址。
2、strcat函数的作用
strcat函数是在一个字符串后面追加一个字符串,也就是将两个字符串拼接起来。
3、strcat函数的细节分析
①strcat会从目标空间字符串的第一个'\0'处开始追加字符串,且追加字符串时会将第一个'0'给覆盖掉。
②目标空间必须足够大,且可以进行修改。
③目标空间必须得有'\0'
④源字符串中必须也得有'\0',追加时'\0'也被追加过去。
#include<stdio.h>#include<stdio.h>int main(){char ch1[20] = "Hello \0*******";char ch2[] = "World!";strcat(ch1,ch2);return 0;}
这是目标空间的第一个'\0'的位置,追加的字符串将从这个位置开始追加。
第一个箭头的指向证明了,strcat函数是从第一个'\0'的位置开始追加的,第二个箭头证明了,源字符串的'\0'也被追加了过去,那个位置原本是'*',可以看一下上一个图。
4、strcat函数的模拟实现
char* my_strcat(char* des, const char* sou){ asset(des && sou);//这个要引头文件include<assert.h>,作用是检查这两个指针是不是空指针char* p = des;while (*des){des++;}while (*des++ = *sou++);return p;}
这个函数的思路就是,先找到目标空间中字符串的'\0',然后将源字符串在'\0'处进行拷贝。
★模拟实现的扩展,虽然这个函数的作用是在一个字符串后追加另一个字符串,但是VS中给出的strcat函数可以在字符串后追加自己,而我们前面模拟实现的这个函数是做不到的,分析如下图:
通过图,我们发现,这会一直陷入循环,没有结束的时候。所以,我们可以对我们的代码稍加优化,使我们的模拟实现具备这个功能,但是,虽然具有这个功能,我们尽量不要使用,因为strcat这个函数的作用是是在一个字符串后追加另一个字符串。VS具有这个功能,我们也可以实现这个功能,但是别的编译器不一定具备,所以为了可移植性更好,不要随便使用。
改进代码如下:
<方法一>统计长度
char* my_strcat1(char* des, const char* sou){char* ret = des;int len = strlen(sou);while (*des){des++;}for (int i = 0; i < len; i++,des++,sou++){*des = *sou;}*des = '\0';return ret;}
先让指向目标空间的指针找到字符串的'\0',然后求出源字符串的长度,然后根据这个长度用for循环拷贝源字符串到目标空间字符串的末尾。
<方法二>偏移调整
char* my_strcat2(char* des, const char* sou){char* ret = des;while (*des++);char* midp = des-1;while (*des++ = *sou++);while (*(midp+1)){*midp = *(midp + 1);midp++;}*midp = *(midp + 1);return ret;}
思路是,我们将源字符串追加到目标空间字符串的'\0'之后,追加完成之后,我们再将追加的字符串向前移动一个char类型,将'\0'给覆盖。
<方法三>先后放置
char* my_strcat3(char* des, const char* sou){char* dret = des;char* sret = sou;while (*des++);char* midp = des - 1;sou++;while (*des++ = *sou++);*midp = *sret;return dret;}
思路是,我们先将源字符串的第二个及以后的字符串追加到目标空间字符串的'\0'之后,等追加完成,我们再用源字符串的第一个字符去覆盖'\0'