1

我正在做 K&R练习 5-4 (p107)。

编写函数 strend(s,t) ,如果字符串 t 出现在字符串 s 的末尾,则返回 1,否则返回 0。

我认为最好的方法是...

  • 将两个指针都递增到末尾
  • 当每个字符匹配时,通过两个字符串倒数
  • 如果我们已经完成计数到第二个字符串的开头,则返回 1

所以这就是我所拥有的......

int strend(const char *str1, const char *str2) {
   int i = 0; 
   while (*str1++ != '\0');

   while (*str2++ != '\0') {
      i++;
   }
   i++;

   while (*str2-- == *str1-- && i > 0) {
     i--;
   }

   return (i == 0);
}

如您所见,我使用计数器来判断我何时到达第二个字符串的开头。

是否有任何其他循环可以在没有计数器的情况下使用来判断我们何时到达字符串的开头(类似于寻找\0字符串的结尾)?

谢谢。

更新

没想到要使用指针-我仍在学习并忘记了一些事情!

我想出了这个...

int strend(const char *str1, const char *str2) {
   char *start = str2; 
   while (*str1++ != '\0');

   while (*str2++ != '\0');

   while (*str2-- == *str1--) {
     if (str2 == start) {
         return 1;
     }
   }

   return 0;
}
4

5 回答 5

4

检查匹配的指针?

于 2010-10-16T11:40:12.207 回答
2

将当前字符的地址与原始字符串指针进行比较?如果它们匹配,则当前字符必须是第一个字符,因此是字符串的开头。

于 2010-10-16T11:40:03.153 回答
2

你可以使用标准的 C 函数吗?如果是这样,您可以使用 strlen() 来获取每个字符串的长度。

例如,

int lenS = strlen(s);
int lenT = strlen(t);

for (int i = 0; i < lenT; ++i) {
  if (s[lenS - i] != t[lenT - i])
    return 0;
}

return 1;
于 2010-10-16T11:46:27.570 回答
1

C 字符串的开头没有指示符来标识字符串的开始位置。您必须保留对字符串开头的一些引用,例如制作指针的副本str1

此外,对于本练习,您不必进行反向扫描。您可以使用前向扫描来做到这一点,并且您可以进行某些检查以查看是否值得费心查看是否str2str1.

于 2010-10-16T11:46:23.333 回答
1

如果您被允许使用字符串函数:

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st < s) return 0;
    if (!strcmp(st,t)) return 1;
    return 0;
}

tia 更好(评论):

int strend(char *s, char *t)
{
    char *st = s + strlen(s) - strlen(t);
    if (st >= s) return !(strcmp(st,t)); else return 0

}

于 2010-10-16T11:57:51.023 回答