【问题标题】:Writing strend(s, t) (check if `s` ends with `t`) using pointers使用指针编写 strend(s, t)(检查 `s` 是否以 `t` 结尾)
【发布时间】:2013-05-11 07:50:18
【问题描述】:

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

【问题讨论】:

  • (*i++ == *t++ != '\0') 应该是 (*i++ == *t++)
  • 我看不出 K&R 和 C++ 之间的关系。 (提示,提示)
  • @glglgl 但是指针和c++是有关系的。
  • 我还可以建议放入一组空的大括号以获得良好的造型吗(即使这只是一个练习)?虽然该循环在技术上是正确的,但对于按原样维护代码的人来说很容易混淆。尽管这个操作很深奥,但通常会假设分号是一个错字。删除那个分号真的会改变程序的逻辑。请记住:无论是使用() 进行操作命令还是使用{} 显式定义代码块,对代码排序过于明确从来都不是一件坏事。
  • 在取消引用 i 之前,您可能需要检查 s 是否比 t 短。

标签: c string algorithm pointers


【解决方案1】:

条件

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

【讨论】:

  • @ShuklaSannidhya 不完全是,看最后一部分。
  • @DanielFischer 在哪种情况下会失败?
  • @ShuklaSannidhya 如果 0 终止符之前的最后一个字符不匹配,while(*i && *i++ == *t++); 将失败,但之前不匹配,例如"abcfob""foo"。在最后一个字符处,*i++ == *t++ 会将'b''o' 进行比较,但会增加指针,尽管它们不相等,所以i 仍然指向循环后的终止符。
【解决方案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;
}

我试过了,效果很好。

【讨论】:

  • @ShuklaSannidhya 它在这里返回1
  • 是的,它有效。我写了 while (*i & *i++ == *t++ ) 我忘了一个 & 符号 (&),这就是它不起作用的原因。
  • 不适用于strend("abcfob", "foo"),我也没有立即注意到。
猜你喜欢
  • 2018-02-04
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多