Home  >  Q&A  >  body text

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

在《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);
}

图片版的原文在此:

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

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

PHPzPHPz2714 days ago538

reply all(1)I'll reply

  • 大家讲道理

    大家讲道理2017-04-17 13:38:16

    1. Don’t forget that there are a0 += 1; and a1 += 1;, so that the address will step backwards according to the type of the array, and the values ​​obtained by a0[0] and a1[0] will also Changes with the value in the step address. Additionally, this implementation could be simpler.

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

    2, if (t0 == 0) In the ASCII code table, char '

    reply
    0
  • Cancelreply