課題
改行文字やタブのよな文字を、目で見えるエスケープ文字\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