C语言学习笔记---字符串拼接函数 strcat() 和 strncat()

1,483 阅读3分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

strcat()函数

   strcat()函数主要用来拼接字符串,用于将一个字符串拼接到另一个字符串的后面。下面通过一个简单的例子来演示一下这个函数的使用方法。

int main()
{
	char str1[10]="123";
	char str2[4]="abc";
	
	printf("str1:%s\r\n",str1);
	printf("str2:%s\r\n",str2);
	
	strcat(str1,str2);
	
	printf("str1:%s\r\n",str1);
	printf("str2:%s\r\n",str2);

	system("pause");
	return 0;
}

   定义了两个字符串str1和str2,首先将两个字符串打印出来,接着使用strcat()函数将str2字符串拼接到字符串str1的后面,最后再将两个字符串打印一遍。输出结果如下: 在这里插入图片描述   通过输出的结果可以看到字符串2的确已经被拼接到了字符串1的后面。   但是使用这个函数的时候要注意一点,这个函数默认是不检测字符串1的长度的,如果字符串1的长度不能够容纳下字符串2,就可能会导致字符溢出。比如在这里给字符串1追加一个比较长的字符串2。 在这里插入图片描述   当程序运行完成之后,软件出现了错误。这就说明在使用strcat()函数向str1字符串追加内容的时候,由于str1空间比较小,而追加的字符又很多,就会导致多出来的字符溢出到相邻的存储空间中,导致软件运行奔溃。

strncat()函数

  为了解决正问题,系统又提供了一个新的字符串追加函数strncat()。这个函数相比strcat()函数多了一个参数,第三个参数用于设置追加内容的长度。这样在追加字符串的时候,就可以控制追加的字符长度,不会出现溢出的情况。

int main()
{
	char str1[10]="123";
	char str2[]="abcdefghjhijkl";
	
	int cnt = 0,cnt1 = 0,cnt2 = 0;
	
	printf("str1:%s\r\n",str1);
	printf("str2:%s\r\n",str2);
	
	cnt = strlen(str1);
	cnt1 = sizeof(str1) / sizeof(str1[0]);
	cnt2 = cnt1 - cnt;
	printf("%d,%d,%d\r\n",cnt,cnt1,cnt2-1);
	
	strncat(str1,str2,cnt2);
	
	printf("str1:%s\r\n",str1);
	printf("str2:%s\r\n",str2);

	system("pause");
	return 0;
}

  首先打印原始的字符串1和字符串2内容,接下来使用strlen()函数计算出字符串1实际占用的大小,使用sizeof()函数计算出字符串的总空间大小,然后计算这两个数据的差,就是字符串1中的剩余空间。当使用strncat()函数拼接字符串的时候,最后一个参数就是字符串1中的剩余空间大小。这样在拼接字符串的时候,就不会导致数据溢出了。 在这里插入图片描述

  通过打印的结果可以看出,拼接后的字符串1,最后拼接的字符只是截取了字符串2的一部分,并没有将字符串2的内容全部拼接进去。拼接的字符串长度为6。计算出来字符串剩余长度为7,但是这里面也把字符串最后一位为空字符'\0',计算进去了。所以在使用strncat()函数时,最后一个参数的长度要减1,给字符串1留一个空白字符的位置。