以下
#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++))
同时递增指针s1
和s2
,只要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
循环后的空字符。
我哪里错了?
答案 0 :(得分:12)
缺陷是++
在循环中完成,即使在最后一个角色上也不匹配。如果以下字符匹配(在这种情况下它是空终止符),则它们将比较为真。
答案 1 :(得分:4)
问题出在后增量运算符
while (*s1 && (*s1++ == *s2++));
在比较最后一个非空字符后增加s1
时,比较返回false,但指针仍会递增。错误的评估导致while循环终止。但是下一行你使用指针指向空字符(他们这样做)来表示字符串匹配(这不匹配)的条件。因此,即使最后一个字符不匹配,您的代码也会考虑匹配任何字符串。