自定义 strcmp (C) 中的奇怪错误

Weird bug in custom strcmp (C)

我有一个编写自定义 strcmp 的任务,它将比较两个字符串有点忽略它们中的空格(意思是," a b c""abc")和 return 一些正数,如果 str1>str2,如果 str2>str1 则为负,如果 str1=str2 则为 0。这是代码

int mystrcmp(const char *str1, const char *str2)
{
    while (*str1 != '[=10=]' && *str2 != '[=10=]') {
        while ((*str1) == ' ') {
            str1++;
        }
        while ((*str2) == ' ') {
            str2++;
        }
        if (*str1 != *str2 || *str1 == 0 || *str2 == 0) {
            return (unsigned char) *str1 - (unsigned char) *str2;
        }
        str1++;
        str2++;
    }
    return (unsigned char) *str1 - (unsigned char) *str2;
}

问题是它不能与被认为相等的 "ab ""ab" 一起正常工作。那些 while 应该得到 str1str2 指向 '[=20=]' 的指针,然后减去它们和 return 0。相反,它 returns 32,这意味着它没有str1'[=20=]'。我错过了什么?

外循环继续,而两个指针都没有结束;这不满足于恰好有一个在最后(这意味着它一旦 either 指针在最后就停止)。

只要在您的其中一个字符串中找到“\0”,您的循环就会停止。但另一个字符串可能仍包含 space。当你比较 "ab"
和 "ab ",第二个字符串将永远不会完全迭代其他。您需要确保您的两个字符串都不会以 space 结尾。试试这个修复:

while (*str1 != '[=10=]' && *str2 != '[=10=]') {
    while ((*str1) == ' ') {
        str1++;
    }
    while ((*str2) == ' ') {
        str2++;
    }
    if (*str1 != *str2 || *str1 == 0 || *str2 == 0)
         break ;
    str1++;
    str2++;
}
while (*str1 == ' ')
    str1++;
while (*str2 == ' ')
    str2++;
return (unsigned char) *str1 - (unsigned char) *str2;

共享代码的问题在于,当任何字符串到达​​“\0”时,外部 while 循环就会中断。试试下面的代码,它确保两个字符串都循环到最后以检查匹配。

int mystrcmp(const char *str1, const char *str2)
{
    while (1) {
        while ((*str1) == ' ') {
            str1++;
        }
        while ((*str2) == ' ') {
            str2++;
        }
        if (*str1 != *str2 ) {
            return (unsigned char) *str1 - (unsigned char) *str2;
        }
        if ((*str1) != '[=10=]') str1++;
        if ((*str2) != '[=10=]') str2++;

        if ((*str1) == '[=10=]' && (*str2) == '[=10=]')
        {
            return 0;
        }
    }
}