我正在编写 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)
是错误的,因为 "acefooD"
不以 "foo"
结尾.
这是我的代码。它总是返回 0
(错误的)。我不明白为什么。
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中的一个练习。
最佳答案
条件
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
。
关于c - 使用指针写入 strend(s, t)(检查 `s` 是否以 `t` 结尾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587100/