开发者

In C, there is a way to know when the end of string is reached. Is there a way to know the start when iterating backwards?

I'm doing K&R Exercise 5-4 (p107).

Write the function strend(s,t) , which returns 1 if the string t occurs at the end of the string s, and zero otherwise.

I figured the best way to do this was to...

  • increment both pointers to the end
  • count backwards through both strings whilst each char matches
  • return 1 if we had finished counting to the beginning of the second string

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

As you can see, I used a counter to tell when I had arrived at the beginning of the second string.

Is there any other loop I can use without a counter to tell when we have arrived at the start of the string (similar to looking for \0 for the end of a string)?

Thanks.

Update

Didn't think to use pointers - I'm still learning and forgetting a few things!

I came up with this...

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


Check for matching pointers?


Compare the address of the current character to the original string pointer? If they match, then the current character must be the first one and thus the start of the string.


Are you allowed to use standard C functions? If so, you can use strlen() to get the length of each string.

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;


There is no indicator at the beginning of C strings that identify that is where the string begins. You have to keep some reference to the beginning of the string, like making a copy of the pointer str1.

Also, for this exercise, you do not have to do it with backward scanning. You can do it with using forward scanning and there are certain checks you can make to see if it's worthwhile to even bother seeing if str2 is in str1.


if you're allowed to use string functions:

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

Even better by tia (comments):

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

}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜