练习 3-2 编写一个函数 escape(s, t),将字符串 t 复制到字符串 s 中,并在复制过程中将换行符、制表符等不可见字符分别转换为\n、\t 等相应的可见的转义字符序列。要求使用 swich 语句。再编写一个具有相反功能的函数,在复制过程中将转义字符序列转换为实际字符。
#include <stdio.h>
#define MAXLEN 100
void escape(char s[], char t[]);
void escape_rev(char s[], char t[]);
int main()
{
char s[MAXLEN], t[MAXLEN], s_2[MAXLEN], t_2[MAXLEN];
int c, i;
i = 0;
printf("input string with enter or tab:\n");
while ((c = getchar()) != EOF)
s[i++] = c;
s[i] = '\0';
escape(s, t);
printf("input string with \\t, \\n:\n");
i = 0;
while ((c = getchar()) != EOF)
s_2[i++] = c;
s[i] = '\0';
escape_rev(s_2, t_2);
return 0;
}
void escape(char s[], char t[])
{
int i, j;
for (i = 0, j = 0; s[i] != '\0'; i++, j++)
{
switch (s[i])
{
case '\t':
t[j] = '\\';
t[++j] = 't';
break;
case '\n':
t[j] = '\\';
t[++j] = 'n';
break;
default:
t[j] = s[i];
break;
}
}
t[i] = '\0';
printf("escaped t is:%s\n\n", t);
return;
}
void escape_rev(char s[], char t[])
{
int i, j;
for (i = 0, j = 0; s[i] != '\0'; i++, j++)
{
if (s[i] == '\\')
{
switch (s[++i])
{
case 't':
t[j] = '\t';
break;
case 'n':
t[j] = '\n';
break;
default:
t[j] = '\\';
--i;
break;
}
}
else
t[j] = s[i];
}
t[j] = '\0';
printf("reversed t_2 is:%s\n", t);
return;
}