diff options
Diffstat (limited to '')
-rw-r--r-- | ch2/2-04_squeeze-v2.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/ch2/2-04_squeeze-v2.c b/ch2/2-04_squeeze-v2.c new file mode 100644 index 0000000..2c3b56a --- /dev/null +++ b/ch2/2-04_squeeze-v2.c @@ -0,0 +1,51 @@ +#include <stdio.h> + +/* The C Programming Language: 2nd Edition + * + * Exercise 2-4: Write an alternate version of squeeze(s1, s2) that deletes + * each character in s1 that matches any character in the string s2. + * + * Answer: This one is fairly easy, considering the fun trick that's covered + * in the passage before this exercise with the unary operators ++ and --. C's + * interesting behavior with these operators allows the programmer to write + * shorter, faster logic. + * + * That said, I couldn't find a way to iterate through s2[] and s1[] in a + * single loop, and I needed to use a flag. There may be a more clever way to + * solve this. + * + */ + +// It'd be better to make this return a pointer (or string), but the book +// hasn't covered it yet! +void squeeze(char s1[], char s2[]) { + int i, j, k, match; + + for (i = j = 0; s1[i] != '\0'; i++) { + // I don't see a way to do this without a flag + match = 0; + for (k = 0; s2[k] != '\0'; k++) { + if (s1[i] == s2[k]) { + match = 1; + break; + } + } + // check our flag. if there wasn't a match, j needs to match i's value + if (!match) { + s1[j++] = s1[i]; + } + } + + s1[j] = '\0'; +} + +int main() { + char foo[16] = "foobarbaz"; + char bar[16] = "boz"; + + squeeze(foo, bar); + + printf("%s\n", foo); // Should read "fara" + + return 0; +} |