ITPub博客

首页 > 应用开发 > C/C++ > Chapter 3, 4 Answer

Chapter 3, 4 Answer

原创 C/C++ 作者:wq_brilliant 时间:2019-03-30 21:46:54 1 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Chapter 1, 2 Answer
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-12-27

  • 博文量
    6
  • 访问量
    3338