C语言库函数:memcmp/strcmp和strncmp的区别

memcmp/strcmp和strncmp的区别

在C语言的string.h库中,有这样3个相似的函数:memcmp,strcmp,strncmp。他们的原型分别如下:

/************************************************************************
 *功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较
 *输入:str1:要比较的字符串
 *		str2:要比较的字符串
 *		n:要比较的字节数
 *输出:无
 *返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int memcmp(const void *str1, const void *str2, size_t n);
/************************************************************************
 *功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
 *输入:str1:要进行比较的第一个字符串。
 *		str2:要进行比较的第二个字符串。
 *输出:无
 *返回:返回值小于 0,则表示 str1 小于 str2。
 *		返回值大于 0,则表示 str1 大于 str2。
 *		返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strcmp(const char *str1, const char *str2);
/************************************************************************
 *功能:把 str1 和 str2 进行比较,最多比较前 n 个字节
 *输入:str1:要进行比较的第一个字符串。
 *		str2:要进行比较的第二个字符串。
 *		n:要比较的最大字符数
 *输出:无
 *返回:返回值小于 0,则表示 str1 小于 str2。
 *		返回值大于 0,则表示 str1 大于 str2。
 *		返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strncmp(const char *str1, const char *str2, size_t n);

他们的区别如下:

  • memcmp是比较两个存储空间的前n个字节,即使字符串已经结束,仍然要比较剩余的空间,直到比较完n个字节。
  • strcmp比较的是两个字符串,任一字符串结束,则比较结束。
  • strncmp在strcmp的基础上增加比较个数,其结束条件包括任一字符串结束和比较完n个字节。

举例说明

void display(int ret)
{
	if(ret > 0)
		printf("str1 大于 str2\r\n");
	else if(ret < 0) 
		printf("str1 小于 str2\r\n");
	else 
		printf("str1 等于 str2\r\n");
}
int main()
{
	char str1[10] = {"12345"};
	char str2[10] = "12345";
	int n = 8;
	int ret,i;

	str1[5] = 0;
	memset(str1 + 6,'1',4);//在str1后面添加字符‘1’
	printf("str1:%s\r\n",str1);
	printf("str2:%s\r\n",str2);
	printf("str1空间:");
	for(i = 0;i<sizeof(str1);i++)
		printf("%d ",str1[i]);
	printf("\r\nstr2空间:");
	for(i = 0;i<sizeof(str2);i++)
		printf("%d ",str2[i]);

	printf("\r\n使用 strcmp 比较:");
	ret = strcmp(str1, str2);
	display(ret);

	printf("\r\n使用 memcmp 比较前%d字节:",n);
	ret = memcmp(str1, str2,n);
	display(ret);

	printf("\r\n使用 strncmp 比较前%d字节:",n);
	ret = strncmp(str1, str2,n);
	display(ret);


	printf("\r\n");
	system("pause");
	return 0;
}

运行结果如下图:
在这里插入图片描述
从运行结果可以看出,str1整个空间实际存储的数要大,但是str1和str2含有相同的字符串。
使用strcmp比较时,只比较到字符串结束,所以str1等于str2;使用memcmp比较时,比较n个字节空间的大小,所以str1大于str2;使用strncmp比较时,也是比较到字符串结束,所以只比较到前5个字节,所以str1等于str2。

原创不易,转载请表明出处。

附录:源码实现

/************************************************************************
 *功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较
 *输入:str1:要比较的字符串
 *		str2:要比较的字符串
 *		n:要比较的字节数
 *输出:无
 *返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int Mymemcmp(const void *str1, const void *str2, size_t n)
{
	char *temp1,*temp2;
	if(str1 == NULL || str2 == NULL)
	{
		printf("字符串不能为空!\r\n");
		exit(-1);
	}
	temp1 = (char *)str1;
	temp2 = (char *)str2;
	while(n --)
	{
		if(*temp1 > *temp2)
			return 1;
		else if(*temp1 < *temp2)
			return -1;
		temp1 ++;
		temp2 ++;
	}
	return 0;
}
/************************************************************************
 *功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
 *输入:str1:要进行比较的第一个字符串。
 *		str2:要进行比较的第二个字符串。
 *输出:无
 *返回:返回值小于 0,则表示 str1 小于 str2。
 *		返回值大于 0,则表示 str1 大于 str2。
 *		返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrcmp(const char *str1, const char *str2)
{
	char *temp1,*temp2;
	if(str1 == NULL || str2 == NULL)
	{
		printf("字符串不能为空!\r\n");
		exit(-1);
	}
	temp1 = (char *)str1;
	temp2 = (char *)str2;
	while(*temp1 != 0 || *temp2 != 0)
	{
		if(*temp1 > *temp2)
			return 1;
		else if(*temp1 < *temp2)
			return -1;
		temp1 ++;
		temp2 ++;
	}
	return 0;
}
/************************************************************************
 *功能:把 str1 和 str2 进行比较,最多比较前 n 个字节
 *输入:str1:要进行比较的第一个字符串。
 *		str2:要进行比较的第二个字符串。
 *		n:要比较的最大字符数
 *输出:无
 *返回:返回值小于 0,则表示 str1 小于 str2。
 *		返回值大于 0,则表示 str1 大于 str2。
 *		返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrncmp(const char *str1, const char *str2, size_t n)
{
	char *temp1,*temp2;
	if(str1 == NULL || str2 == NULL)
	{
		printf("字符串不能为空!\r\n");
		exit(-1);
	}
	temp1 = (char *)str1;
	temp2 = (char *)str2;
	while((*temp1 != 0 && *temp2 != 0) && n--)
	{
		if(*temp1 > *temp2)
			return 1;
		else if(*temp1 < *temp2)
			return -1;
		temp1 ++;
		temp2 ++;
	}
	if(n)//由于字符串结束而提前结束
	{
		if(*temp1 == 0 && *temp2 != 0)//str1比str2短
			return -1;
		else if(*temp1 != 0 && *temp2 == 0)//str1比str2长
			return 1;
		else
			return 0;
	}
	return 0;
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengwang0301

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值