From 239a885d441cdb3585c42b594ed9e87b37b33c62 Mon Sep 17 00:00:00 2001 From: zlg Date: Wed, 27 Mar 2013 05:00:43 -0500 Subject: Solve Exercise 2-5: The any() function --- ch2/2-05_any-func.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 ch2/2-05_any-func.c diff --git a/ch2/2-05_any-func.c b/ch2/2-05_any-func.c new file mode 100644 index 0000000..c515fab --- /dev/null +++ b/ch2/2-05_any-func.c @@ -0,0 +1,44 @@ +#include + +/* The C Programming Language: 2nd Edition + * + * Exercise 2-5: Write the function any(s1,s2), which returns the first + * location of 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.) + * + * Answer: Similarly to squeeze(), any() uses two loops to do its job, but + * instead of changing the string, we're just returning the index of the first + * character found. If it's not found, it'll return a negative number. This + * is a common practice in functions that return integers since it gives + * programmers an easy case to check for: if any() returns anything less than + * zero, the characters in s2 weren't found. + * + */ + +int any(char s1[], char s2[]) { + int i, j; + for (i = j = 0; s1[i] != '\0'; ++i) { + while (s2[j++] != '\0') { + if (s1[i] == s2[j]) { + return i; + } + } + j = 0; + } + return -1; +} + +int main() { + char foo[80] = "argle bargle"; + char bar[80] = "toobz"; + int result; + + if ((result = any(foo, bar)) != -1) { + printf("Found a match at position %d!\n", result); + } else { + printf("No match found.\n"); + } + // Should return a match at index 6. + return 0; +} -- cgit v1.2.3-54-g00ecf