这个字符串比较逻辑的缺陷是什么?

时间:2015-04-27 14:24:12

标签: c++ string algorithm

以下

#include <iostream>

unsigned short int stringCompare ( char * s1, char * s2 )
{
// returns 1 if the character arrays s1 and s2 are equal; 
// returns 0 otherwise
    while (*s1 && (*s1++ == *s2++));
    return (!(*s1) && !(*s2));
}

int main () 
{
    char str1 [] = "americano";
    char str2 [] = "americana";
    std::cout << stringCompare(str1,str2);
    return 0;
}

打印1,意味着我的函数的逻辑不正确。我想明白为什么。让我解释一下我的逻辑:

while (*s1 && (*s1++ == *s2++))

同时递增指针s1s2,只要s1不等于'\0'且值s1指向的值与值{{1}相同} 指着。它应该是一种较短的写作方式

s2

并依赖于花哨的运算符优先级来缩短它。

声明

while (*s1 && *s2)
{
   if (*s1 != *s2) break;
   ++s1; ++s2;
}

表示

return (!(*s1) && !(*s2))

因为如果字符串相等,那么"If s1 and s2 are both the null character, return true; otherwise return false" s1都将是s2循环后的空字符。

我哪里错了?

2 个答案:

答案 0 :(得分:12)

缺陷是++在循环中完成,即使在最后一个角色上也不匹配。如果以下字符匹配(在这种情况下它是空终止符),则它们将比较为真。

答案 1 :(得分:4)

问题出在后增量运算符

while (*s1 && (*s1++ == *s2++));

在比较最后一个非空字符后增加s1时,比较返回false,但指针仍会递增。错误的评估导致while循环终止。但是下一行你使用指针指向空字符(他们这样做)来表示字符串匹配(这不匹配)的条件。因此,即使最后一个字符不匹配,您的代码也会考虑匹配任何字符串。