strcmp函数实现分解
strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果,函数形式如下
int strcmp ( const char * str1 , const char * str2 ) ;
其中str1和str2可以是字符串常量或者字符串变量,返回值为整形。返回结果如下规定:
①str1小于str2返回负值或者-1
②str1等于str2返回0
③str1大于str2返回正值或者1
strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:
首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果,如果相等就接着比较第二个字符,然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。strcmp算法的可以有多种,不过我觉的可以把这么多算法分为两种:一种是利用减法运算判断结果,另一种是利用比较运算==得出结果。
例1:减法实现
int strcmp (const char * str1 , const char *str2 )
{
int ret = 0 ;
while ( ! ( ret = * ( unsigned char * ) str1 - * (unsigned char * ) str2 ) && *str1 )
{
str1++;
str2++;
}
i f ( ret < 0 )
{
return -1 ;
}
else if(ret > 0)
{
return 1;
}
return 0;
}
这个函数要注意的几点:
(1)使用*(unsigned char *)str1而不是用*str1。这是因为传入的参数为有符号数,
有符号字符值的范围是-128-127,无符号字符值的范围是0-255,而字符串的ASCII没有负值,若不转化为无符号数,在减法实现时出现错误。
例如:str的值为1,str2的值为255。
作为无符号数计算时ret=-254,结果为负值,正确。
作为有符号数计算时ret=-2,结果为正值,错误。
(2)while循环中(ret=*(unsigned char *)str1 - *(unsigned char *)str2)&& *str1,最后的str1也可以换成str2,因为前面已经做了相减,无论哪个先为'\0'都会退出。
(3)这个函数没有判断参数为NULL时的情况,所以当传入NULL时程序会崩溃。
例2:用比较实现
int strcmp(const char *str1,const char * str2)
{
while((*str1)&&(*str1 == *str2))
{
str1++;
str2++;
}
if(*(unsiged char *)str1 > *(unsiged char *)str2)
{
return 1;
}
else if(*(unsiged char *)str1 < *(unsiged char *)str2)
{
return -1;
}
else
{
return 0;
}
}
注意:把while循环简写成while((*str1)&&(*str1++ == *str2++))
当str1为abcd, str2为abfd时,由于判断到第三个字符时while推出,而str指针又加了1,str都指向第四个字符输出结果为0,显然 这是错误的。