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,显然 这是错误的。

posted @ 2012-09-23 16:53  kaifublog  阅读(521)  评论(0编辑  收藏  举报