【问题标题】:What is the flaw in this string comparison logic?这个字符串比较逻辑有什么缺陷?
【发布时间】:2015-07-06 01:33:41
【问题描述】:

以下

#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 指向的值与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"

因为如果字符串相等,那么s1s2while 循环之后都是空字符。

我哪里错了?

【问题讨论】:

  • 您是否考虑过简单地逐步执行算法?你会很快发现问题...

标签: c++ string algorithm


【解决方案1】:

缺陷在于++ 即使在最后一个字符不匹配时也在循环中完成。如果以下字符匹配(在本例中为空终止符),则它们比较为真。

【讨论】:

  • 是的;我会写while (*s1 &amp;&amp; (*s1 == *s2)) { s1++; s2++; } 或其他什么。
  • 哦...所以它不会短路?
  • 如果满足第一个条件,@CrappyProgrammer &amp;&amp; 会短路,但在本例中没有。
【解决方案2】:

问题在于后自增运算符

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

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

【讨论】:

  • 增量不一定是比较之后。发生的情况是用于比较的值是前一个序列点的值,而在下一个序列点,指针将增加。没有特定的顺序来进行增量和比较。这样想是一种简化的视图,可能会在更复杂的表达式中导致错误。
  • @pmg 是的,公平点,它的措辞很糟糕。我已经对其进行了编辑以试图更好地解释。
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 2015-10-19
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多