字符串中strcmp和strncmp的比较

strcmp:函数原型是int strcmp(const char *s1,const char *s2),功能如下:若strl=str2,则返回0;若strl-1;若strl>str2,则返回1

strncmp:函数原型是int strncmp( const char * strl, const charstr2, size_t n),功能是把str1和 str2进行比较,最多比较前n个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回正数;若s1小于2则返回负数。

注意:

(1)、两者比较的方法相同,都是逐个字符去比较 ACSII码,一旦比较出大小返回。

(2)、strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串,故要多传一个长度参数,这也使得strncmp比strcmp更加精细。

(3)、需要包含头文件#include

strcmp

#include 
#include 
#include 

int myStrcmp(char *str1, char *str2)
{
	int ret = 0;
	int n_str1 = 0;
	int n_str2 = 0;
	char *bakStr1 = str1;
	char *bakStr2 = str2;

	while( *str1 != 0 && *str2 != 0 && (*str1 == *str2))
	{
		str1++;
		str2++;
	}
	if(*str1 || *str2)//还没到末尾就跳出上面的循环
	{
		str1 = bakStr1;//让str1回到bakstr1原先的位置,并根据上面跳出循环的位置进行下面操作
		str2 = bakStr2;//让str2回到bakstr2原先的位置,并根据上面跳出循环的位置进行下面操作
		while(*str1 != 0)
		{
			n_str1 += *str1;//计算str1的ACSII码
			str1++;
		}
		while(*str2 != 0)
		{
			n_str2 += *str2;//计算str2的ACSII码
			str2++;
		}
	}
	ret = n_str1 - n_str2;//比较两者ACSII码的大小
	if(ret < 0)
	{
		ret = -1;
	}
	if(ret > 0)
	{
		ret = 1;
	}
	return ret;
}
int main()
{
	char *p1 = "abcdefg";
	char *p2 = "aaceefg";

	int ret = myStrcmp(p1,p2);//-1 1 0
	
	printf("RET = %d\n",ret);
	return 0;
}

b比a大1,而后面的e比d大1,所以两者的ACSII码之和相同,输出0。

strncmp

#include 
#include 

int main ()
{
	char str1[15];
	char str2[15];
	int ret;

	strcpy(str1, "accdef");
	strcpy(str2, "abcdef");

	ret = strncmp(str1, str2, 4);//比较前4个

	if(ret < 0)
	{
		printf("str1 小于 str2");
	}
	else if(ret > 0) 
	{
		printf("str2 小于 str1");
	}
	else 
	{
		printf("str1 等于 str2");
	}
	
	return(0);
}

前四位中第二位时c大于b,所以str2小于str1。

你可能感兴趣的:(c语言,算法)