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