3

我正在编写 的实现strend(s, t),它检查字符串是否以 strings结尾t

例如,如果 -

char s[] = "abcdefoo";
char t[] = "foo";

那么,strend(s, t)是真的,因为以 ."abcdefoo"结尾"foo"

但是,如果——

char s[] = "acefooD";
char t[] = "foo";

那么,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;
}

为什么它不起作用?

PS:这是K&R2中的一个练习。

4

2 回答 2

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仅在两个指向的字符匹配时才增加。

于 2013-05-16T12:15:14.143 回答
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;
}

我试过了,它有效。

于 2013-05-16T12:15:28.847 回答