(C语言进阶)strcmp

内容重点:

重点介绍处理字符和字符串的库函数的使用和注意事项

 下面是将要介绍的几个函数:

  • 求字符串长度 strlen
  • 长度不受限制的字符串函数 strcpy strcat strcmp(本节)
  • 长度受限制的字符串函数介绍 strncpy strncat strncmp
  • 字符串查找 strstr strtok
  • 错误信息报告 strerror
  • 字符操作
  • 内存操作函数 memcpy memmove memset memcmp

 

strcmp

int strcmp ( const char * str1, const char * str2 );

译文:

比较两个字符串
将C字符串str1与C字符串str2进行比较。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或达到终止的null字符为止。
此函数执行字符的二进制比较。有关考虑区域设置特定规则的函数,请参阅strcoll。

返回值:

 比较规则:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

 注意:这里比较的是ASCII的值,而与字符串的长度无关!同时执行过程为从头到尾挨个进行,直到找到两个数组中不相同的字符时才开始比较。


 1.使用示例(需要比较字符串的情况下)

错误示例:
if ("abcdef" == "bcdefg") //这里比较的是两个字符串首字符的地址,而不是字符串的内容

这里用判断的==是两个字符串的首个字符的地址是否相等,而不是比较字符串长度。

同时注意,比较两个字符串内容的时候,不能使用==,应该使用strcmp

正确示例:
示例1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "bdcef";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

输出结果为:

解释:

从头开始a的ASCII值小于b的ASCII的值,因此arr1的内容小于arr2的内容,故输出的值小于0

示例2
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	char arr1[] = "abcdeg";
	char arr2[] = "abcdefgh";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

输出结果:

解释: 

从头开始两个数组的内容一直相等,直到第六位时开始不同,g的ASCII值大于f的ASCII的值,因此arr1的内容大于arr2的内容,故输出的值大于0

示例3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	char arr1[] = "abcdefgh";
	char arr2[] = "abcdefgh";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

输出结果: 

解释: 

从头开始到尾两个数组的内容一直相同,故输出的值等于0。

 

2.模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	//if (*str1 > *str2)
		//return 1;
	//else
		//return -1;//这里模拟vs的返回值1或者-1
	return *str1 - *str2;//这里的返回的值是ASCII值相减
}

int main()
{
	char arr1[] = "abzcde";
	char arr2[] = "abq";
	printf("%d\n", my_strcmp(arr1, arr2));
	return 0;
}

输出结果:

注意,如果要写成下面的代码时

if(strcmp(arr1,arr2)==1);//尽量写成if(strcmp(arr1,arr2)>0);
 printf(">");

尽量写成

if(strcmp(arr1,arr2)>0);
 printf(">");

因为在vs的编译情况下输出结果才为0,-1,1这三个值。为了防止在其他编译器情况不可以,尽量写成>0的形式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值