在C中,有一种方法可以知道何时到达字符串的结尾。有没有办法在向后迭代时知道开始?

时间:2010-10-16 11:36:50

标签: c kernighan-and-ritchie

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

  

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

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

  • 将两个指针递增到结尾
  • 在两个字符串向后计数,而每个字符匹配
  • 如果我们已完成计数到第二个字符串的开头
  • ,则返回1

所以here is what I have ......

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;
}

5 个答案:

答案 0 :(得分:4)

检查匹配的指针?

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

E.G,

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;

答案 3 :(得分:1)

在C字符串的开头没有指示符,表示字符串开始的位置。你必须保持对字符串开头的一些引用,比如复制指针str1

此外,对于本练习,您不必使用向后扫描。您可以使用正向扫描执行此操作,并且您可以进行某些检查,以查看是否值得查看str2中是否str1

答案 4 :(得分: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

}