From 45ba544bf9d9bf80676117868f6bfd1bcabec1ea Mon Sep 17 00:00:00 2001 From: zlg Date: Tue, 16 Apr 2013 23:22:12 -0500 Subject: Solve Exercise 3-2: escape/unescape --- ch3/3-02_escape.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 ch3/3-02_escape.c (limited to 'ch3/3-02_escape.c') diff --git a/ch3/3-02_escape.c b/ch3/3-02_escape.c new file mode 100644 index 0000000..04910ec --- /dev/null +++ b/ch3/3-02_escape.c @@ -0,0 +1,68 @@ +#include + +/* The C Programming Language: 2nd Edition + * + * Exercise 3-2: Write a function escape(s,t) that converts characters like + * newline and tab into visible escape sequences like \n and \t as it copies + * the string t to s. Use a switch. Write a function for the other direction + * as well, converting escape sequences into the real characters. + * + * Answer: Fun! Switches can be used as shorthand if-else chains. + */ + +#define STRMAX 80 + +void escape(char s[], char t[]) { + // i for t, j for s + int i, j; + j = 0; + for (i = 0; t[i] != '\0'; i++) { + switch(t[i]) { + case '\n': + s[j++] = '\\'; + s[j++] = 'n'; + break; + case '\t': + s[j++] = '\\'; + s[j++] = 't'; + break; + default: + s[j++] = t[i]; + break; + } + } + s[j] = '\0'; +} + +void unescape(char s[], char t[]) { + // i for t, j for s + int i, j; + j = 0; + for (i = 0; t[i] != '\0'; i++) { + if (t[i] == '\\') { + switch (t[i + 1]) { + case 'n': + s[j++] = '\n'; + break; + case 't': + s[j++] = '\t'; + break; + } + } else { + s[j++] = t[i]; + } + } + s[j] = '\0'; +} + +int main() { + char src[STRMAX] = "foo\nbar\t\tbaz\nnozzle"; + char dest[STRMAX] = ""; + /* Let's escape it... */ + escape(dest, src); + printf("%s\n", dest); + /* ...and unescape it! */ + unescape(dest, src); + printf("%s\n", dest); + return 0; +} -- cgit v1.2.3-54-g00ecf