前言:在上一章,介绍了长度不受限制的字符串函数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:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,希望朋友们给点点赞和关注。