Shu*_*hya 3 c string algorithm pointers
我正在编写一个实现strend(s, t),它检查字符串是否以字符串s结尾t.
例如,如果 -
char s[] = "abcdefoo";
char t[] = "foo";
Run Code Online (Sandbox Code Playgroud)
然后,strend(s, t)是真的,因为"abcdefoo"结束"foo".
但是,如果 -
char s[] = "acefooD";
char t[] = "foo";
Run Code Online (Sandbox Code Playgroud)
然后,strend(s, t)是假的,因为"acefooD"没有结束"foo".
这是我的代码.它总是返回0(false).我不明白为什么.
int strend(char *s, char *t)
{
char *i;
i = s + strlen(s) - strlen(t);
while (*i++ == *t++ != '\0')
;
if (*i == '\0')
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么不工作?
PS:这是K&R2的练习.
条件
while (*i++ == *t++ != '\0')
Run Code Online (Sandbox Code Playgroud)
没有做你期望它做的事.它评估*i++ == *t++,产生0或1,并检查该值是否与0不同,因此相当于
while (*i++ == *t++)
Run Code Online (Sandbox Code Playgroud)
然后,当s结束时t,你已经i超过了0终结符.
检查一下*i != 0,
while (*i && *i++ == *t++);
Run Code Online (Sandbox Code Playgroud)
停在0终结点.但是如果在0终结符之前的最后一个字符不匹配,那将失败,因为那时两个指针仍将递增,并i指向终结符,因此更好地使用
while (*i && *i == *t++) i++;
Run Code Online (Sandbox Code Playgroud)
仅i在两个指向字符匹配时递增.