K&R演習[3-2]

課題

改行文字やタブのよな文字を、目で見えるエスケープ文字\nや\tに変換しながら、sをtにコピーするような関数escape(s, t)を書け。
逆に、エスケープ系列を実際の文字に変換する関数も書いてみよ。

回答

/*
 * @file        3-2
 * @brief
 * @author
 * @date
 * @note
 */



#include <stdio.h>

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


/*
 * @fn      Main
 * @brief   
 * @param
 * @return
 * @note
 */
int main(void)
{
    char tmp[100], tmp2[100];

    // escapeの動作確認
    sprintf(tmp, "fdsa89ifdka\tfdas\nfda\tfa\n");
    escape(tmp, tmp2);
    printf("Org:%s\nEdt:%s\n", tmp, tmp2);

    printf("\n");

    // inv_escapeの動作確認
    sprintf(tmp, "uewakjfs\tfdsa\nfewa\tfdsa\n");
    escape(tmp, tmp2);
    printf("Org:%s\nEdt:%s\n", tmp, tmp2);

}

/*
 * @fn      escape
 * @brief   
 * @param   
 * @return
 * @note
 */
void escape(const char *s, char *t)
{
    int n = 0, m = 0;

    while (*(s + n) != '\0') {
        switch (*(s + n)) {
            case '\t':  *(t + m) = '\\';    m++; *(t + m) = 't';    break;  // 1文字目に\, 2文字目にt
            case '\n':  *(t + m) = '\\';    m++; *(t + m) = 'n';    break;  // 1文字目に\, 2文字目にn
            default:    *(t + m) = *(s + n);    break;  // 上記以外は、そのまま格納
        }
        n++;
        m++;
    }
    *(t + m) = '\0';    // 行末
}

/*
 * @fn      inv_escape
 * @brief   
 * @param   
 * @return
 * @note
 */
void inv_escape(const char *s, char *t)
{
    int n = 0, m = 0;

    while (*(s + n) != '\0') {
        switch (*(s + n)) {
            case '\\':
                n++;
                switch (*(s + n)) {
                    case 't':   *(t + m) = '\t';    printf("ent\n");    break;
                    case 'n':   *(t + m) = '\n';    printf("enn\n");    break;
                    default:    *(t + m) = *(s + n);    break;  // 上記以外は、そのまま格納。本当はもっとあるけど
                }
                break;
                
            default:            *(t + m) = *(s + n);    break;  // 上記以外は、そのまま格納
        }
        n++;
        m++;
    }
    *(t + m) = '\0';    // 行末
}

実行結果

Org:fdsa89ifdka fdas
fda     fa

Edt:fdsa89ifdka\tfdas\nfda\tfa\n

Org:uewakjfs\   fdsa\
fewa\   fdsa\

Edt:uewakjfs\\tfdsa\\nfewa\\tfdsa\\n