//字符串压缩
#include<iostream>
#include<cstdlib>
#include<cstring>
const int SIZE=200;//待压缩的字符串规模
using namespace std;
void CompressStr(const char *SrcStr, char *DstStr)
{
const char *p=SrcStr;
const char *q=p;//p、q和SrcStr都指向该字符串
int str_size=strlen(p);//字符串长度
//cout<<str_size;
int num=1;//计数器初始值
int k=0;//目标字符串DstStr的下标
if(str_size==1)
{
*DstStr=*p;
}
else
{
int i=0,j=0;
for(i=0;i<str_size;)
{
for(j=i+1;j<str_size;j++)
{
if(p[i]==q[j])
++num;
else
{
if(num != 1)
{
DstStr[k++]=p[i];
//紧跟重复字母的个数
//DstStr[k++]=static_cast<char>(num);//这样转化行不通
if(num<10)//2-9的数字转化为字符2-9
DstStr[k++]=(char)(num+'0');
else if(num>10 && num<100)//10-99的数字转化为字符10-99
DstStr[k++]=(char)(num/10+'0'), DstStr[k++]=(char)(num%10+'0');
else if(num>=100)//100以上的数字转化为字符?
DstStr[k++]='?';
num=1;
i=j;
break;
}
else
{
DstStr[k++]=p[i];
num=1;
i++;
break;
}
}
}
//处理特殊情况1:字符串的末尾是不重复的单个字符
if(i==str_size-1 && j==str_size)
{
DstStr[k++]=p[i];
DstStr[k]='\0';
break;
}
//处理特殊情况2:字符串的末尾是重复的多个字符
if(num!=1 && j==str_size)
{
DstStr[k++]=p[i];
//紧跟重复字母的个数
if(num<10)//2-9的数字转化为字符2-9
DstStr[k++]=(char)(num+'0');
else if(num>10 && num<100)//10-99的数字转化为字符10-99
DstStr[k++]=(char)(num/10+'0'), DstStr[k++]=(char)(num%10+'0');
else if(num>=100)//100以上的数字转化为字符?
DstStr[k++]='?';
DstStr[k]='\0';
break;
}
}
}
}
int main(void)
{
char str_SrcStr[SIZE]={'\0'};
cout<<"输入待压缩字符串:";
cin>>str_SrcStr;
char str_DstStr[SIZE]={'\0'};
CompressStr(str_SrcStr,str_DstStr);
cout<<"输出已压缩字符串:";
cout<<str_DstStr;
cout<<endl;
system("pause");
return 0;
}