diff options
author | zlg <zlg@zlg.space> | 2013-07-22 04:38:53 -0500 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2013-07-22 04:38:53 -0500 |
commit | dc209d744e8db39cf5a5f6eea59e4edda2051514 (patch) | |
tree | a644590d2c8f3cc7c8b69cabbb06bbed43023022 | |
parent | Solve Exercise 4-12: Recursive itoa() (diff) | |
download | knr-dc209d744e8db39cf5a5f6eea59e4edda2051514.tar.gz knr-dc209d744e8db39cf5a5f6eea59e4edda2051514.tar.bz2 knr-dc209d744e8db39cf5a5f6eea59e4edda2051514.tar.xz knr-dc209d744e8db39cf5a5f6eea59e4edda2051514.zip |
Solve Exercise 4-13: Recursive reverse()
-rw-r--r-- | ch4/4-13_recursive-reverse.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/ch4/4-13_recursive-reverse.c b/ch4/4-13_recursive-reverse.c new file mode 100644 index 0000000..85a5b91 --- /dev/null +++ b/ch4/4-13_recursive-reverse.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <string.h> + +/* The C Programming Language: 2nd Edition + * + * Exercise 4-13: Write a recursive version of the function reverse(s), which + * reverses the string `s` in place. + * + * Answer: Much like the last exercise, the trick is in terminating your flow + * early and resetting state for the next string. + */ + +void reverse(char[]); + +int main() { + char foo[40] = "Learning C is fun and challenging."; + printf("Before: %s\n", foo); + reverse(foo); + printf(" After: %s\n", foo); + /* I don't know how to set a char array to another string... */ + char bar[30] = "Hello out there!"; + printf("Before: %s\n", bar); + reverse(bar); + printf(" After: %s\n", bar); + return 0; +} + +void reverse(char s[]) { + static int i = 0; + static int j = 0; + int c; + + if (j == 0) { + j = strlen(s) - 1; + } + + if (i < j) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + i++; + j--; + reverse(s); + return; + } + i = 0; + j = 0; +} |