一. 介绍函数
打开strcat - C++ Reference 网址,在里面查看函数的相关介绍
翻译过来,strcat函数其实是对字符串进行数据追加,在目标空间指针所指向的'\0'处,将需要追加的字符串赋值到此处.
函数所接受的参数 :
参数1(char* dest) : 指向目标空间的字符指针.
参数2(const char* src) : 指向源字符串的字符指针.
函数的返回类型 :
返回类型(char*) : 返回的是字符指针.
二. 函数的用法
了解到函数接受的参数是指针,也就是地址,所以传参就需要传字符数组的地址.
代码如下 :
#include<stdio.h>
#include<string.h>
int main()
{
char ar1[10] = "abc";
char ar2[] = "def";
strcat(ar1, ar2);
printf("%s", ar1);
return 0;
}
运行结果 :
可以看到ar2中的数据成功的追加到了ar1后.
三. 模拟实现
学会了如何使用strcat,接下来尝试模拟实现.
首先,因为是在目标空间的末尾处进行追加,所以需要让指针遍历到'\0'处.
代码如下 :
char* my_strcat(char* dest, const char* src)
{
while (*dest != '\0')
{
dest++;
}
通过使用while循环来判断dest解引用后的值是否为'\0' , 若不是则dest++, 直到*dest == '\0' , 再结束循环.
接着, 找到了目标空间的末尾,就要进行拷贝字符
代码如下 :
while (*dest++ = *src++)
{
;
}
同样, 通过while循环进行赋值, src解引用后赋值给dest指向的空间, 当src解引用后为 '\0' 赋值给dest, 则循环体的判断条件为0 ,循环结束 . 在while循环体中,可以直接用分号,允许不写语句.但要保证能够结束循环.
最后, 由于函数的返回值是char*类型, 而dest经过遍历,不再指向起始地址,所以在遍历之前,保存到临时变量中.
完整代码如下 :
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest; //将desr保存到临时变量中
assert(dest && src); //断言,保证dest和src不为空指针
while (*dest != '\0') //循环遍历dest指向末尾
{
dest++;
}
while (*dest++ = *src++) //循环赋值
{
;
}
return ret; //返回临时保存的变量
}
int main()
{
char ar1[10] = "abc";
char ar2[] = "xyt";
my_strcat(ar1, ar2);
printf("%s", ar1);
return 0;
}
四. 注意事项
1. 目标空间必须足够大 , 还需要可以修改 , 避免出现数组越界情况 .
2. 目标空间中必须要有'\0', 保证能找到目标空间的末尾.
3. 源字符串中也必须要有'\0', 在拷贝是会将源字符串中的'\0'一同拷贝.
4. strcat函数不能自己追加自己, 由于目标空间不断地追加自己, '\0' 会被覆盖,导致无法遇到 '\0'
会导致死循环.