演習3-2 K&R プログラミング言語C

演習3-2

改行、タブを \n\t に変換する escape 関数

#include <stdio.h>
#define MAX 1024

void escape(char *s, char *t);

int main(int argc, char *argv[])
{
    int i, c;
    char s[MAX];
    char t[MAX];

    i = 0;
    while ((c = getchar()) != EOF) {
        s[i] = c;
        i++;
    }
    s[i] = '\0';

    escape(s, t);
    printf("%s", t);

    return 0;
}

void escape(char *s, char *t)
{
    int i, j;

    j = 0;
    for (i = 0 ; s[i] != '\0'; i++) {
        switch (s[i]) {
            case '\t':
                t[j] = '\\';
                j++;
                t[j] = 't';
                j++;
                break;
            case '\n':
                t[j] = '\\';
                j++;
                t[j] = 'n';
                j++;
                t[j] = '\n';
                j++;
                break;
            default:
                t[j] = s[i];
                j++;
                break;
        }
    }
    t[j] = '\0';
}

\n\t を改行、タブに変換する unescape 関数

#include <stdio.h>
#define MAX 1024

void unescape(char *s, char *t);

int main(int argc, char *argv[])
{
    int i, c;
    char s[MAX];
    char t[MAX];

    i = 0;
    while ((c = getchar()) != EOF) {
        s[i] = c;
        i++;
    }
    s[i] = '\0';

    unescape(s, t);
    printf("%s", t);

    return 0;
}

void unescape(char *s, char *t)
{
    int i, j, c;

    for (i = 0, j = 0; s[i] != '\0'; i++) {
        c = s[i];
        if (c == '\\') {
            switch (s[i+1]) {
                case 't':
                    t[j] = '\t';
                    j++;
                    i++;
                    break;
                case 'n':
                    i++;
                    break;
                default:
                    t[j] = c;
                    j++;
                    break;
            }
        } else {
            t[j] = c;
            j++;
        }
    }
    t[j] = '\0';
}

実行結果

$ cat hoge.txt
hello	world.
from	japan.
$ cat hoge.txt | ./escape
hello\tworld.\n
from\tjapan.\n
$ cat hoge.txt | ./escape | ./unescape
hello	world.
from	japan.
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»