目录
1. strcat函数详解
1. strcat函数模拟实现
3. strcat函数的危险性
4. strncat函数详解
4.1 strncat函数的特殊情况验证
1. strcat函数详解
头文件<string.h>
该函数是用来对字符串末尾追加字符串的,有两个参数,destination是要被追加的字符串,source是要追加的字符串,函数返回destination
演示:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = { "abcdef" };
char arr2[10] = { "abc" };
strcat(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
结果是:
在arr2后追加了arr1的内容,但追加后arr2后是否还有\0呢我们来看一下
可见strcat从arr2可中第一个\0开始追加,无论后面还有没有数据,并且arr2后面是被主动加了一个\0,
1. strcat函数模拟实现
代码:
#include <assert.h>
char* my_strcat(char* dest, const char* sour)
{
assert(dest && sour != NULL);
char* p = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *sour++)
{
;
}
return p;
}
运行结果:
可见我们的代码是符合要求的。
3. strcat函数的危险性
我们来看一种情况:
arr2追加arr1的所有数据后已经放满,arr2内部结尾就没有\0了,但是arr2结尾外面被追加了一个\0,运行时报错:
显示arr2周围栈被破坏
我们再看一下这种情况:
和上一种情况相似,arr2外面的内容也被修改了,同样成功打印了出来,所以arr2外面结尾有\0,系统同样报错了。
因此我们要避免这种请路况,这也是strcat函数的危险之处,我们无法保证destination能够将source全部接收,且没有报错,相比之下我们最好使用strncat函数。
4. strncat函数详解
相比于strcat它多了一个参数num
num是传入要追加的字符串长度。在我们写代码的时候就要考虑好想要追加几个字符。
演示:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = { "abcdef" };
char arr2[10] = { "xxxx" };
strncat(arr2, arr1,3);
printf("%s\n", arr2);
return 0;
}
结果:
4.1 strncat函数的特殊情况验证
下面我们来进行一些特殊情况的验证;
可见在追加结尾会加一个\0.
再看一种情况:
可见如果num大于arr1的大小,也不会报错,追加完已有的字符串后就停止了追加,相当于没加猜数的strcat函数。
strncat安全在于使用前我们要考虑好数组的大小,防止了意外报错。
感谢观看,欢迎在评论区讨论