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

目录

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

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 14:16:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 14:16:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 14:16:03       82 阅读
  4. Python语言-面向对象

    2024-03-14 14:16:03       91 阅读

热门阅读

  1. JVM运行时数据区概述以及分别存放的内容

    2024-03-14 14:16:03       49 阅读
  2. Linux SHELL脚本编程

    2024-03-14 14:16:03       44 阅读
  3. wrap:包装

    2024-03-14 14:16:03       35 阅读
  4. RocketMQ之基于Docker安装

    2024-03-14 14:16:03       44 阅读
  5. virtual-pc/VMware/bochs的区别

    2024-03-14 14:16:03       46 阅读
  6. 数据库设计三范式

    2024-03-14 14:16:03       47 阅读
  7. Unix运维_CMake教程_CMake中的link_libraries指令

    2024-03-14 14:16:03       39 阅读
  8. springBean的三种实例化

    2024-03-14 14:16:03       42 阅读