长度受限制的字符串函数strncpy,strncat,strncmp

前言:在上一章,介绍了长度不受限制的字符串函数strcpy,strcat,strcmp,本章将介绍与它们对应的长度受限制的字符串函数strncpy,strncat,strncmp

strncpy(字符串复制函数)

strncpy与strcpy不同的地方就是多了个n,代表它是长度受限制的字符串复制函数

cplusplus介绍如下:

在这里插入图片描述

由上图可知,strncpy有3个参数,第一个为目标数组,第二个为要复制的源字符串,第三个为要从源字符串复制的最大字符数
(1)若限制字符数小于等于源字符串有效长度,则不会在复制结尾添加终止空字符’\0’,这点与strcpy有所区别
(2)若限制字符串大于源字符串有效长度,则会在多余的地方补’\0’

举以下例子,方便大家理解上述第1点:

#include<stdio.h>
#include<string.h>    //引用字符串函数头文件
int main()
{
    
    
	char arr1[] = "abcd";      //要复制的源字符串
	char arr2[] = "xxxxx";     //目标数组
	char arr3[] = "xxxxx";     //目标数组
	strcpy(arr2, arr1);        //将arr1的内容拷贝到arr2
	strncpy(arr3, arr1,4);     //将arr1的4个字符串拷贝到arr2
	printf("strcpy:%s\n", arr2);    //打印拷贝后的arr2数组
	printf("strncpy:%s\n", arr3);   //打印拷贝后的arr3数组
	return 0;
}

输出:
在这里插入图片描述

可以看到,strcpy与strncpy的打印结果有所区别,因为strcpy会在拷贝结束后结尾加上终止空字符’\0’,而该题中限制字符数等于源字符串,strncpy不会在拷贝结尾加上终止空字符’\0’

举以下例子,方便大家理解上述第二点

#include<stdio.h>
#include<string.h>     //引用字符串函数头文件
int main()
{
    
    
	char arr1[] = "abcd";    //源字符串
	char arr2[] = "xxxxx";   //目标数组
	strncpy(arr2, arr1,5);   //将arr1的5个字符串拷贝到arr2,但是arr1只有4个有效字符
	printf("strncpy:%s\n", arr2);  //打印拷贝后的arr2数组
	return 0;
}

输出:
在这里插入图片描述
此时的监视窗口情况:
拷贝前:
在这里插入图片描述

拷贝后:
在这里插入图片描述

通过上图监视窗口,我们发现arr2中下标为4的值由x变为’\0’,这就是多余补’\0’的情况,因此上面输出结果中第5个x消失了

strncat(字符串连接函数)

与上面的差不多,strncat是长度受限制的字符串连接函数

cplusplus介绍如下:

在这里插入图片描述

由上图可知,strncat有3个参数,第一个为目标字符串,第二个为要连接的源字符串,第三个为要从源字符串复制的追加字符数
目标字符串的终止空字符‘\0’会被源字符串的第一个字符覆盖
追加结束后结尾补上终止空字符’\0’,注意是补上!!!
若追加字符数大于源字符串大小,则追加完源字符串(包括’\0’)就停止,不会补’\0’

举以下例子,方便大家理解上述最后一点:

#include<stdio.h>
#include<string.h>    //引用字符串函数头文件
int main()
{
    
    
	char arr1[20] = "abcd \0xxxxxxxx";  //目标字符串,在abcd后补个'\0',便于马上监视观察
	char arr2[] = "hello";              //追加字符串
	strncat(arr1, arr2,7);              //将arr2数组的7个字符连接到arr1后
	printf("%s\n", arr1);               //打印连接后的arr1数组
	return 0;
}

输出:
在这里插入图片描述
监视窗口:
连接前
在这里插入图片描述
连接后:
在这里插入图片描述

比较上面两张监视图片,可以发现,下标为11及其以后的数组内容并未被改变。

strcat为什么不能自己追加自己

在上一篇文章中,曾提到过这个问题,但因篇幅原因,并未讲解,在这里对其进行解释

#include<stdio.h>
#include<string.h>     //引用字符串函数头文件
int main()
{
    
    
	char arr[10] = "abcd";   
	strcat(arr, arr);
	printf("%s", arr);
	return 0;
}

作图解释:
在这里插入图片描述

在VS中输出:在这里插入图片描述
在DEV中输出:在这里插入图片描述

可以发现,在VS中我们得到了我们想要的结果,但在DEV中结果却不正确,因为连接覆盖了目标字符串的终止空字符’\0’,而目标字符串与追加字符串是相同的,所以追加字符串中结尾没有’\0’,代码无法停止。

strncmp(字符串比较函数)

strncmp是长度受限制的字符串比较函数

cplusplus介绍如下:

在这里插入图片描述

由上图可知,strncmp有3个参数,第一第二个为要进行比较的字符串,第三个为要比较的字符数

字符串比较规则

从第一个字符开始,比较其ASCII码值,若相等,则对应的第二个字符相互比较,以此类推,若前者大于后者,则返回一个大于0的数字,若前者小于后者,则返回一个小于0的数字,若两者相等,则返回0

strncpy的返回值图表

在这里插入图片描述
举以下代码,方便大家理解:

#include<stdio.h>
#include<string.h>    //引用字符串函数头文件
int main()
{
    
    
	char arr1[] = "abcd"; 
	char arr2[] = "abcf";
	printf("%d\n", strcmp(arr1, arr2));  
	printf("%d\n", strncmp(arr1, arr2,3));  
	return 0;
}

输出:
在这里插入图片描述

strcmp比较到第4个字符d与f,前者小于后者,返回小于0的值,而strncmp限制比较3个字符,到c停止,前者等于后者,返回0

文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,希望朋友们给点点赞和关注。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_73390155/article/details/129646855