PAT1078字符串压缩与解压的代码实现及错误分析(C语言)

题目

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入格式:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

输出格式:

根据要求压缩或解压字符串,并在一行中输出结果。

输入样例 1:

C
TTTTThhiiiis isssss a   tesssst CAaaa as

输出样例 1:

5T2h4is i5s a3 te4st CA3a as

输入样例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例 2:

TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

实现思路:

1.编写压缩输出函数,逐个遍历比较和后一位是否相等,若相等则计数加1,若不等,则根据计数输出;

2.编写解压输出函数,逐个遍历验证是否为数字,若是数字则赋值给计数,若不是,则根据计数输出;

3.主函数存入数据,根据操作符号调用函数。

代码实现:

#include<stdio.h>
#include<string.h>

void printYS(char data[])
{
  int cnt=1,len=strlen(data);//这里计数从1开始
  for(int i=0;i<len-1;i++)//遍历范围到倒数第二位
  {
    if(data[i]!=data[i+1])
    {
      if(cnt==1)
      {
        printf("%c",data[i]);
      }
      else
      {
        printf("%d%c",cnt,data[i]);
      }
      cnt=1;
    }
    else
    {
      cnt++;
    }
  }
  if(cnt==1)//最后输出倒数第一位
  {
    printf("%c",data[len-1]);
  }
  else
  {
    printf("%d%c",cnt,data[len-1]);
  }
}

void printJY(char data[])
{
  int cnt=0,len=strlen(data);//计数器初始化为0
  for(int i=0;i<len-1;i++)
  {
    if(data[i]>='0'&&data[i]<='9')
    {
      cnt=cnt*10+data[i]-'0';//可能有多位数字
    }
    else
    {
      if(cnt==0)
      {
        printf("%c",data[i]);
      }
      else
      {
        for(int j=0;j<cnt;j++)
        {
          printf("%c",data[i]);
        }
        cnt=0;//重新置为0
      }
    }
  }
  if(cnt==0)//输出最后一位
  {
    printf("%c",data[len-1]);
  }
  else
  {
    for(int j=0;j<cnt;j++)
    {
      printf("%c",data[len-1]);
    }
  }
}

int main()
{
  char szHandle;
  scanf("%c",&szHandle);
  char szData[1001]={0};
  getchar();//跳过回车
  gets(szData);
  if(szHandle=='C')
  {
    printYS(szData);
  }
  else
  {
    printJY(szData);
  }
  return 0;
}

错误分析:

1.不要漏掉最后一位的处理;

2.压缩函数因为要逐个计数,要从1开始,解压函数是直接赋值,并且与多位数字累加相关,所以初始化为0。

猜你喜欢

转载自blog.csdn.net/bawangtu/article/details/81503521