# Exercise 2.5 - return the first location in the string s1 comparing s2¶

## Question¶

Write the function any(s1,s2), which returns the first location in a string s1 where any character from the string s2 occurs, or -1 if s1 contains no characters from s2. (The standard library function strpbrk does the same job but returns a pointer to the location.)

```/**
* Exercise 2.5
*
* Write the function any(s1,s2) which returns the first location in the string
* s1 where any character from the string s2 occurs, or -1 if s1 contains
* no characters from s2. ( The standard library function strpbrk does
* the same job but returns a pointer to the location
*
**/

#include <stdio.h>

#define MAXLINE 1000

int mgetline(char line[], int lim);

int any(char s1[], const char s2[]);

int main(void) {
char s1[MAXLINE], s2[MAXLINE];
int val;

mgetline(s1, MAXLINE);
mgetline(s2, MAXLINE);

val = any(s1, s2);

printf("%d", val);

return 0;
}

int mgetline(char line[], int lim) {
int i, c;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
line[i] = c;

if (c == '\n')
line[i++] = c;
line[i] = '\0';

return i;
}

int any(char s1[], const char s2[]) {
int i, j;

for (i = 0; s1[i] != '\0'; ++i) {
for (j = 0; s2[j] != '\0'; ++j) {
if (s1[i] == s2[j] && s1[i] != '\n') {
return i;
}
}
}

return -1;
}
```

## Explanation¶

The important part of the program is the function any which takes two strings s1 and s2 and tries to find if any character in s2 matches s1. We set a flag, check_next_char which is toggled to 0 if we find the match, otherwise we have it as 1.

The first for loop iterates through all the characters in s1 while the condition check_next_char is 1. In the second for loop, if we find that a char in s2 matches s1, that is s2[j] == s1[i] and s2 has not reached EOL, then we set check_next_char to 0. That is we found a match at i and we return that.

If we dont find a match in s2, we increment i and take the next character from s1. If dont find a match at all, then we return -1.