Exercise 5.4 - strend returns 1 if string t occurs at the end of the string s¶
Question¶
Write the function strend(s,t), which returns 1 if the string t occurs at the end of the string s, and zero otherwise.
#include<stdio.h>
#define MAXLINE 1000
int mgetline(char s[], int lim);
int strend(char *s, char *t);
int mystrlen(char *t);
int main(void) {
char s[MAXLINE], t[MAXLINE];
int ret;
mgetline(s, MAXLINE);
mgetline(t, MAXLINE);
ret = strend(s, t);
printf("%d", ret);
return 0;
}
int mgetline(char s[], int lim) {
int c, i;
for (i = 0; i < lim - 1 && ((c = getchar()) != EOF) && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
int strend(char *s, char *t) {
int len;
len = mystrlen(t);
while (*s != '\0')
++s;
--s;
while (*t != '\0')
++t;
--t;
while (len > 0) {
if (*t == *s) {
--t;
--s;
--len;
} else
return 0;
}
if (len == 0)
return 1;
}
int mystrlen(char *t) {
char *p;
p = t;
while (*p != '\0')
++p;
return p - t;
}
Explanation¶
This program determines if the string t occurs at the end of string s. So the output of the program will look like.
$ ./a.out
something
thing
1
$ ./a.out
something
non
0
The primary part of this program is the strend function, which takes two character pointers, s and t. It calculates the length of t and stores in the variable len. And then, we back off till the last characters in both s and t.
while(*s!='\0')
++s;
--s;
while(*t!='\0')
++t;
--t;
And then we look for the match from the end. This is checked in this while loop. While the len is > 0, check if s and t are same and back off one character at a time.
while(len > 0)
{
if(*t==*s)
{
--t;
--s;
--len;
}
else
return 0;
}
if( len == 0)
return 1;
If the string t exhausts, that is, it’s length, len becomes 0, then we known that string t occurs at the end of string s and we return 1. Otherwise, we return 0.