改行文字などの見えない文字を '\n'(2文字)などに変換しながらコピーする
escape(src, dest)を作成しろという問題。ただし switchを使うこと。
全部のエスケープ文字をしていないけど、この延長でなんとかなるでしょう。
#include <stdio.h> #include <string.h> #include <assert.h> static void escape(char *src, char *dest); static void test_escape(); static void unescape(char *src, char *dest); int main (void) { test_escape(); } static void test_escape() { char dest[2048]; escape("", dest); assert(!strcmp(dest, "")); escape("a", dest); assert(!strcmp(dest, "a")); escape("\\", dest); assert(!strcmp(dest, "\\")); escape("\n", dest); assert(!strcmp(dest, "\\n")); escape("\a\b\t\r\n", dest); assert(!strcmp(dest, "\\a\\b\\t\\r\\n")); unescape("", dest); assert(!strcmp(dest, "")); unescape("a", dest); assert(!strcmp(dest, "a")); unescape("\\k", dest); assert(!strcmp(dest, "\\k")); unescape("\\n", dest); assert(!strcmp(dest, "\n")); unescape("\\a\\b\\t\\r\\n", dest); assert(!strcmp(dest, "\a\b\t\r\n")); } static void unescape(char *src, char *dest) { int i, j; i = 0; j = 0; while (src[i] != '\0') { if (src[i] == '\\') { i++; switch(src[i]) { case 'a': dest[j++] = '\a'; break; case 'b': dest[j++] = '\b'; break; case 't': dest[j++] = '\t'; break; case 'r': dest[j++] = '\r'; break; case 'n': dest[j++] = '\n'; break; default: dest[j++] = '\\'; dest[j++] = src[i]; break; } } else { dest[j++] = src[i]; } i++; } dest[j] = '\0'; } static void escape(char *src, char *dest) { int i, j; i = 0; j = 0; while (src[i] != '\0') { switch (src[i]) { case '\a': dest[j++] = '\\'; dest[j++] = 'a'; break; case '\b': dest[j++] = '\\'; dest[j++] = 'b'; break; case '\t': dest[j++] = '\\'; dest[j++] = 't'; break; case '\r': dest[j++] = '\\'; dest[j++] = 'r'; break; case '\n': dest[j++] = '\\'; dest[j++] = 'n'; break; default: dest[j++] = src[i]; break; } i++; } dest[j] = '\0'; }