长度受限制的字符串函数详解(strncpy,strncat,strncmp)

举报
念君思宁 发表于 2023/02/13 21:38:24 2023/02/13
【摘要】 长度受限制的字符串函数详解(strncpy,strncat,strncmp)

1.另类字符串拷贝函数strncpy

对于字符串的拷贝函数:strcpy函数,笔者在之前已经有过详细的讲解!!有意者请参考链接:字符串拷贝函数:strcpy的详解及模拟实现_念君思宁的博客-CSDN博客但是这篇博客讲解的仍是字符串拷贝函数!!这两个函数有什么不同呢???请跟着笔者思路来进行走下去!!

char * strncpy ( char * destination, const char * source, size_t num )

 在该段代码中:destination是指:目标空间;source 是指:源头; num是指: 限制拷贝的字符数!因此,全部合起来的意思大致为:从源头开始,拷贝num个到目标空间里面

下面请看笔者的代码:简单详解一下:

 
#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxx";
	strncpy(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 1;
}

对于上述代码的运行结果……其实各位老铁都能想象的出来!毕竟,笔者对于strncpy的语法部分已经讲解的很清楚了!!代码的运行结果为:

 但是,疑问也随之而来!!到底还要不要拷贝'\0'呢??疑惑!!!其实这个疑惑,可以经过我们的VS调试可以看出来!!请看……

调试之前的结果为:

 调试之后的结果为:

 因此,关于是否拷贝'\0'这个问题的答案是显而易见的:不拷贝!!

但是对于num请不要滥用,否则将会出现错误……请看案列:

#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "xxx";
	strncpy(arr1, arr2, 8);
	//这里面的num为8,已经超过arr2的大小!!
	printf("%s\n", arr1);
	return 1;
}

上述的该段代码就是一个错误的案列,请各位老铁不要模仿!!至于代码的运行情况,我们可以在调试的过程中观察出来!!

调试前的运行情况为:

调试之后的运行情况为:

 这是一段及其不负责的写法!请不要参考借鉴!!请按照规范来进行答题!!

综上所述:我们可以总结出来一下规律:

拷贝num个字符串,从源字符串到目标空间,但是,如果源字符串的长度小于num,则拷贝完,源字符串之后,在目标空间的后面加'\0', 直到num个!!

2.另类字符串追加函数:strncat

char * strncpy ( char * destination, const char * source, size_t num )

对于上述语法中:destination 是指:目标空间,cource 是指:源头!num是指个数!因此,总的来说:是将源头的num个字符追加在目标空间!

对于该另类字符串追加函数(strncat)的使用:请详见下列代码:

#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "wang";
	strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

对于上述代码,就是另类字符串追加函数strncat的使用!!因此,代码的运行结果想必大家也是在心里面直接就能想象的出来!在此就不做过多的讲解!请看代码的运行结果为:

 那么疑问也随之而来:对于上述代码,在追加的时候,会不会追加'\0'在后面???

因此,我们可以将上述的代码进行简单的更改:arr1[20]="abcdef\0qqqq"  请参考……

 
#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = "abcdef\0qqqq";
	char arr2[] = "wang";
	strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

对于上述代码的运行结果:

 这样我们就可以通过调试来观察是否追加'\0'了!!

调试到最后,结果为:

 根据上述的调试截图,我们可以看出来:追加了'\0'!!!

因此,对于上述的总结有:strncat字符串追加函数让我追加num个,我就追加num个,追加完就停下来,默认'\0'!!!

那么思考一下!!strncat函数,是否可以实现自己追加自己呢???

答案也是显而易见的:可以实现自己追加自己!

下面请参考一下代码:

#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[20] = "abcd";
	strncat(arr1, arr1, 4);
	printf("%s\n", arr1);
	return 0;
}

对于这个代码,可以实现字符串自己追加自己!!不信的各位老铁,请耐心欣赏笔者之后的截图证明!!

证明一下:strncat函数可以实现自己追加自己的调试……

调试之后的结果为:

 代码的运行结果为:

因此,strncat函数,可以实现自己追加自己!!

3.strncmp另类字符串比较函数!!

 

int strncmp ( const char * str1, const char * str2, size_t num )

 上述语法的简单意思为:将str1 与 str2中的num个字符进行比较!!

返回类型为int(整型)!!

str1 > str2  返回一个大于0的数字:1

str1 < str2  返回一个小于0的数字:-1

str1 < str2  返回0


对于这个情况,想必读者也能很好的理解!!

 
#include <stdio.h>
#include <string.h>
 
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abq";
	
	char arr3[] = "abcd";
	char arr4[] = "abc";
 
	char arr5[] = "abc";
	char arr6[] = "abc";
 
	int ret = strncmp(arr1, arr2,3);
	if (ret > 0)
	{
		printf("arr1>arr2\n");
	}
	else if (ret < 0)
	{
		printf("arr1<arr2\n");
	}
	else
	{
		printf("arr1==arr2\n");
	}
	return 0;
}

这段代码也能诠释strncmp函数的返回值!!

代码的运行结果为:

 到此为止:长度受限制的字符串函数详解(strncpy,strncat,strncmp)已经讲解完毕!!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。