aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-04-16 23:22:12 -0500
committerzlg <zlg@zlg.space>2013-04-16 23:22:12 -0500
commit45ba544bf9d9bf80676117868f6bfd1bcabec1ea (patch)
treefb6518a346b34c1e95cec4d7d65e61ee85fdeccb
parentSolve Exercise 3-1: binsearch2 (diff)
downloadknr-45ba544bf9d9bf80676117868f6bfd1bcabec1ea.tar.gz
knr-45ba544bf9d9bf80676117868f6bfd1bcabec1ea.tar.bz2
knr-45ba544bf9d9bf80676117868f6bfd1bcabec1ea.tar.xz
knr-45ba544bf9d9bf80676117868f6bfd1bcabec1ea.zip
Solve Exercise 3-2: escape/unescape
-rw-r--r--ch3/3-02_escape.c68
1 files changed, 68 insertions, 0 deletions
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 <stdio.h>
+
+/* 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;
+}