プログラミング言語 C 3.2


改行文字などの見えない文字を '\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';
}