3-2 escape.c

久しぶり。switch使うと縦長になるよなぁ。

/*
 * P73 演習3-2
 *   改行文字やタブのような文字を目で見えるエスケープ文字
 *   \nや\tに変換しながら、sをtにコピーするような関数
 *   escape(s, t)を書け。switchを使うこと。逆に、エスケープ系列を
 *   実際の文字に変換する関数も書いてみよ。
 *
 *       2007/07/12 arikui
 */

//Don't attend over flow
char* escape(char *s, char *t){
    int i, j;
    for(i = 0, j = 0; s[i] != '\0'; i++){
        switch(s[i]){
        case '\n':
            t[j++] = '\\';
            t[j++] = 'n';
            break;
        case '\t':
            t[j++] = '\\';
            t[j++] = 't';
            break;
        default:
            t[j++] = s[i];
            break;
        }
    }
    t[j] = '\0';
    return t;
}


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



//Test Driver
#include <stdio.h>

int main(void){
    char base[] = "hello\tworld!\n";
    char buff1[BUFSIZ] = {0}, buff2[BUFSIZ] = {0};
    
    escape(base, buff1);
    printf("[%s] -> [%s]\n", base, buff1);
    
    unescape(buff1, buff2);
    printf("[%s] -> [%s]\n", buff1, buff2);
    
    return 0;
}