C语言中strcmp函数的源代码

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

我认为存在一些问题。如果strlen(s2)>strlen(s1),那么++s1可能超出范围。不幸的是,这时函数会返回错误。


你链接中的代码有一个小问题,就是strcmp和strncmp的返回结果不同。strcmp将结果不必要地限制在-1..+1的范围内,而strncmp则返回完整的差异。 - kusma
3个回答

7

没有这样的问题,因为循环只会在*s1和*s2相等*s2不为0的情况下继续。如果s1较短,在它到达s1末尾的\0时,相等条件将被打破,循环将停止。


1

没有这样的问题,只要 s2 是以 '\0' 结尾的。


1

s1由于零结尾而被隐式保护。这个零结尾将导致"*(unsigned char ) s1"和"(unsigned char *) s2"之间存在差异,从而终止循环。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接