strcmp:
// strcmp
#include <stdio.h>
#include <string.h>
int Strcmp(const char *src, const char *dest)
{
int ret = 0 ;
while( 0 == (ret = *(unsigned char *)src - *(unsigned char *)dest) &&
'\0' != *dest ) { // 字符相同且没到末尾则继续
++src;
++dest;
}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
int main(int argc, char **argv)
{
char str1[] = "cccoder";
char str2[] = "ccCODER";
int result = Strcmp(str1, str2);
char tmp[20];
if( result > 0 )
strcpy( tmp, "greater than" );
else if( result < 0 )
strcpy( tmp, "less than" );
else
strcpy( tmp, "equal to" );
printf( "strcmp: str1 is %s str2\n", tmp );
return 0;
}
1、当两个字符串不等时,strcpy的返回值不是0,源码中是返回-1或1,但有的源码不是返回这两个值,比如返回的是str1[i] - str2[i] (i是遇到的那个不同位置),也可能是其他形式,反正非0的不是个特定值。
2、我觉得还是返回-1,0,1这三个值好点,这样就可以用switch来代替if - else了。
3、上面的源码中那个while内的表达式挺危险的(不过是正确的),若交换“逻辑与”的两边就会出现短路带来的bug,副作用是那个赋值表达式。所以下面有另一版本:
int Strcmp(const char *src, const char *dest)
{
unsigned char c1, c2;
while (1) {
c1 = *src++;
c2 = *dest++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if ('\0' == c1)
break;
}
return 0;
}