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

标签 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)是错误的,因为 "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++)

然后,当 st 结束时,您已经将 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/

相关文章:

c++ - 回声打印实现

c++ - 声明与类型不兼容

algorithm - 剥离填充后解码base64

java - 如果缺少某些字符,则从列表中删除字符串

java - 使用旧版 JAVA API 进行 regExp 匹配

algorithm - 遍历位掩码

java - ArrayList 到数组

objective-c - Objective-C 中什么时候我的 const 应该是静态的?

c - 字符指针数组和二维数组有什么区别?

c - 这个计算每个元音出现次数的 C 程序有什么问题?