关于strcmp()的一种实现算法的疑问

发布于 2022-09-02 12:57:55 字数 1153 浏览 6 评论 0

在《See MIPS Run》的Chapter 9 Reading MIPS Assembly Language中,提到到这样一段代码:

We’ll use the same example as in Chapter 8: an implementation of the C library function strcmp(). But this time we’ll include essential elements of assembly syntax and also show some hand-optimized and -scheduled code. The algorithm shown is somewhat cleverer than a naïve strcmp() function; we’ll start with this code—still in C—in a form that has all the operations separated out to make them easier to play with, as follows:

int strcmp (char *a0, char *a1)
{
    char t0, t1;
    while (1) {
        t0 = a0[0];
        a0 += 1;
        t1 = a1[0];
        a1 += 1;
        if (t0 == 0)
            break;
        if (t0 != t1)
            break;
    }
    return (t0 - t1);
}

图片版的原文在此:

clipboard.png

不是很懂 t0 = a0[0];t1 = a1[0];这个为什么放在while循环里。。。这样难道不是每次循环都从首字符开始了么。。。那么怎么完成字符串的比较呢?

还要一个疑问是。。。if (t0 == 0)难道不应该是if (t0 =='\0')么。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贩梦商人 2022-09-09 12:57:55

1、你别忘了还有 a0 += 1;a1 += 1;,这样其地址会根据数组的类型向后步进,每次步进后 a0[0]a1[0] 取到的值也会跟着步进地址中的值而变化。另外,这个实现可以更简单。

int myStrcmp(const char* dest, const char* src)
{
    // 循环条件每个字符都相等
    // 并且两个字符串都没有到结尾
    // 一旦以上某个条件不满足则跳出while
    while (*dest == *src && *dest != '\0' && *src != '\0')
    {
        dest++; src++;
    }
    // 此时计算最后指向的两个字符的差值,返回对应值即可
    return *dest > *src ? 1 : (*dest == *src ? 0 : -1);
}

2、if (t0 == 0) 在 ASCII 码表中,char '\0' 就是十进制的 0。

图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文