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; }