使用指针编写strend(s,t)(检查`s`是否以`t`结尾)

时间:2013-05-16 12:12:12

标签: c string algorithm pointers

我正在编写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的练习。

2 个答案:

答案 0 :(得分:8)

条件

while (*i++ == *t++ != '\0')

不符合您的预期。它评估*i++ == *t++,产生0或1,并检查该值是否与0不同,因此相当于

while (*i++ == *t++)

然后,当st结尾时,您已将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;
}

我尝试了它并且有效。