首页 > 应用开发 > C/C++ > Chapter 3, 4 Answer
3-2 escape(s, t), 复制字符串 t 到 s,复制过程中将不可见字符 \t \n 分别转换成 \t \n。再编写具有相反功能的函数。
遇到一个字符就判断是不是不可见字符,是,按照规则复制,反之直接复制。
void escape(char s[], char t[])
{
int i = 0, j = 0;
while(t[i] != '\0')
{
switch (t[i])
{
case '\n':
s[j] = '\\';
s[++j] = 'n';
break;
case '\t':
s[j] = '\\';
s[++j] = 't';
break;
default:
s[j] = t[i];
}
i++; j++;
}
s[j] = '\0';
}
void re_escape(char s[], char t[])
{
int i = 0, j = 0;
while(t[i] != '\0')
{
if(t[i] == '\\')
{
i++;
switch(t[i])
{
case 'n':
s[j] = '\n';
break;
case 't':
s[j] = '\t';
break;
}
}
else
s[j] = t[i];
i++;
j++;
}
s[j] = '\0';
}
3-3 编写expand(s1, s2),将 s1 中类似于 a-z 速记符号在字符串 s2中扩展为等价的完整列表 abc...xyz。作为前导和尾随的 - 原样复制。
一直复制,直到遇到减号符 - ,输出 - 左边的字符直到右边的字符为止。
字母和数字在ASCII编码中是连续的。
void expand(char s1[], char s2[])
{
int i = 0, j = 0;
char c;
while(s1[i] == '-') //前导
{
s2[j] = '-';
i++; j++;
}
while(s1[i] != '\0')
{
if(s1[i] != '-') //非 -
s2[j++] = s1[i++];
else
{
if(isdigit(s1[i+1])||isalpha(s1[i+1])) //当前 - 后面跟的是数字或字母
{
c = s2[j-1];
while(c < s1[i+1])
s2[j++] = ++c;
i += 2; // 跳两格
}
else
s2[j++] = s1[i++]; //当前 - 后面跟的是 -
}
}
s2[j] = '\0';
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29000138/viewspace-2639871/ ,如需转载,请注明出处,否则将追究法律责任。