(C语言)strcat函数详解与模拟实现与strncat函数详解

本文详细解释了C语言中的strcat和strncat函数,包括它们的用法、工作原理以及strcat的潜在危险。特别强调了strncat的安全特性,尤其是在处理字符串追加时的长度控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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安全在于使用前我们要考虑好数组的大小,防止了意外报错。

感谢观看,欢迎在评论区讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值