From 999a2d4dcf3d918e37f76aae249b7b23f14bdd7d Mon Sep 17 00:00:00 2001 From: zlg Date: Fri, 22 Mar 2013 11:41:52 -0500 Subject: Solve Exercise 2-04: Squeeze v2 --- ch2/2-04_squeeze-v2.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 ch2/2-04_squeeze-v2.c (limited to 'ch2') 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 + +/* 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; +} -- cgit v1.2.3-54-g00ecf