2010-12-21 138 views
3
int strcmp(const char *s1, const char *s2) 

{ 
    int ret = 0; 

    while (!(ret = *(unsigned char *) s1 - *(unsigned char *) s2) && *s2) ++s1, ++s2; 

    if (ret < 0) 

    ret = -1; 
    else if (ret > 0) 

    ret = 1 ; 

    return ret; 
} 

我回顾从代码:http://www.jbox.dk/sanos/source/lib/string.c.htmlçSTRCMP源代码

我想这是有一些问题。 如果strlen(s2)>strlen(s1),则++s1可能超出范围。不幸的是,那么函数返回错误。

+0

我在链接中看到的一个小问题是strcmp和strncmp以不同的方式返回结果。 strcmp不必要地将结果限制在-1 .. + 1范围内,而strncmp则返回完整的差异。 – kusma 2010-12-21 09:20:34

回答

1

不,不存在这样的问题,只要s2以'\ 0'结尾。

1

s1由于零终止而被隐式保护。零终止将导致“*(无符号字符)s1”和“(无符号字符*)s2”之间存在差异,终止循环。

所以不,代码看起来对我来说是正确的。

7

不,不存在这样的问题,因为循环仅在* s1和* s2相等的情况下继续执行 * s2不是0.如果s1较短,则一旦到达s1末尾的\ 0,平等条件会中断,循环会停止。

+0

谢谢大家。你太棒了! – 2010-12-23 10:20:40