【问题标题】:c strcmp source codec strcmp源代码
【发布时间】:2010-12-21 09:07:20
【问题描述】:
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)&gt;strlen(s1),则++s1 可能超出范围。不幸的是,然后函数返回错误。

【问题讨论】:

  • 我确实看到链接中的代码的一个小问题是 strcmp 和 strncmp 返回的结果不同。 strcmp 不必要地将结果限制在 -1..+1 范围内,而 strncmp 则返回完整的差异。

标签: c


【解决方案1】:

不,不存在这样的问题,因为循环仅在 *s1 和 *s2 相等时继续 并且 *s2 不为 0。如果 s1 更短,一旦它到达 \0 处在 s1 结束时,相等条件将中断并且循环将停止。

【讨论】:

    【解决方案2】:

    不,不存在这样的问题,前提是 s2 是 '\0' 终止的。

    【讨论】:

      【解决方案3】:

      s1 由于零终止而被隐式保护。零终止会导致“*(unsigned char ) s1”和“(unsigned char *) s2”之间存在差异,终止循环。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2016-11-13
        相关资源
        最近更新 更多