我正在编写strend(s, t)
的实现,它会检查字符串s
是否以字符串t
结尾。
示例,如果 -
char s[] = "abcdefoo";
char t[] = "foo";
然后,strend(s, t)
为真,因为"abcdefoo"
以"foo"
结尾。
但是,如果 -
char s[] = "acefooD";
char t[] = "foo";
然后,strend(s, t)
为false,因为"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;
}
为什么不起作用?
PS:这是K& R2的练习。
答案 0 :(得分:8)
条件
while (*i++ == *t++ != '\0')
不符合您的预期。它评估*i++ == *t++
,产生0或1,并检查该值是否与0不同,因此相当于
while (*i++ == *t++)
然后,当s
以t
结尾时,您已将i
递增超过0终结符。
首先检查*i != 0
,
while (*i && *i++ == *t++);
停在0终结符处。但是如果在0终结符之前的最后一个字符不匹配,那将失败,因为那时两个指针仍然会递增,i
指向终结符,所以
更好地使用
while (*i && *i == *t++) i++;
仅在两个指向字符匹配时才递增i
。
答案 1 :(得分:2)
尝试while ( *t && *i++ == *t++ )
。
int strend(char *s, char *t)
{
char *i;
i = s + strlen(s) - strlen(t);
while (*i && *i++ == *t++ )
;
if (*i == '\0')
return 1;
return 0;
}
我尝试了它并且有效。