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; }