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

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的练习.

Dan*_*her 8

条件

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在两个指向字符匹配时递增.

  • @ShuklaSannidhya`while(*i &&*i ++ ==*t ++);`如果在0终止符之前的最后一个字符不匹配,则会失败,但不会在之前,例如``abcfob``和``foo" `.在最后一个字符中,`*i ++ ==*t ++`将''b'`与''o''进行比较,但是增加指针虽然你的不相等,所以`i`仍然指向终止符后循环. (2认同)