diff options
| author | zlg <zlg@zlg.space> | 2013-03-22 11:41:52 -0500 | 
|---|---|---|
| committer | zlg <zlg@zlg.space> | 2013-03-22 11:41:52 -0500 | 
| commit | 999a2d4dcf3d918e37f76aae249b7b23f14bdd7d (patch) | |
| tree | a0f4b452c5e5126d6971c986fb2f49ebd0dc10f8 | |
| parent | Solve Exercise 2-3: Hex to integer converter (diff) | |
| download | knr-999a2d4dcf3d918e37f76aae249b7b23f14bdd7d.tar.gz knr-999a2d4dcf3d918e37f76aae249b7b23f14bdd7d.tar.bz2 knr-999a2d4dcf3d918e37f76aae249b7b23f14bdd7d.tar.xz knr-999a2d4dcf3d918e37f76aae249b7b23f14bdd7d.zip | |
Solve Exercise 2-04: Squeeze v2
| -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; +} | 
