题目描述:
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数:
void stringZip(const char *pInputStr,longlInputLen,char*pOutputStr);
【输入】pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】pOutputStr: 输出字符串,空间已经开辟好,与输入字符
串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO 的输入
输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
自己写的程序版本1(有bug,当重复元素超过9个的时候无法表示。原因:一个char无法表示9以上的整数,因为超过9的就不是一位数了,两位数就是两个char了。)
#include "StdAfx.h"
#include "subStr.h"
#include<iostream>
using namespace std;
void stringZip(const char *pInputStr,long lInputLen,char * pOutputStr){
int repeat=1;
char temp[100];
char *pOutputStrRuler=pOutputStr;
int i;
if(lInputLen==0)
{
printf("invalid parameters");
return;
}
if(lInputLen==1){
printf("%s\n",pInputStr);
return;
}
for(i=0;i<lInputLen;i++)
{
if(pInputStr[i]==pInputStr[i+1] && (i+1)<lInputLen)
{
++repeat;
continue;
}
if(repeat==1){
*pOutputStrRuler=pInputStr[i];
pOutputStrRuler++;
repeat=1;
}else{
*pOutputStrRuler++='0'+repeat;
repeat=1;
*pOutputStrRuler++=pInputStr[i];
}
}
*pOutputStrRuler='\0';
printf("%s\n",pOutputStr);
}
int main(){
char *pInputStr=(char *)malloc(20);
char *pOutputStr=(char *)malloc(20);
scanf("%s",pInputStr);
stringZip(pInputStr,strlen(pInputStr),pOutputStr);
system("pause");
return 0;
}
再来看看版本二,应用到了函数sprintf(目标字符串,格式,参数们),解决了重复数大于9无法显示的bug:
我把修改的部分加个注释。
#include "StdAfx.h"
#include "subStr.h"
#include<iostream>
using namespace std;
void stringZip(const char *pInputStr,long lInputLen,char * pOutputStr){
int repeat=1;
char temp[100];
//char *pOutputStrRuler=pOutputStr;
int i;
if(lInputLen==0)
{
printf("invalid parameters");
return;
}
if(lInputLen==1){
printf("%s\n",pInputStr);
return;
}
memset(pOutputStr,0,sizeof(pOutputStr));
for(i=0;i<lInputLen;i++)
{
if(pInputStr[i]==pInputStr[i+1] && (i+1)<lInputLen)
{
++repeat;
continue;
}
if(repeat==1){
//*pOutputStrRuler=pInputStr[i];
//pOutputStrRuler++;
sprintf(pOutputStr,"%s%c",pOutputStr,pInputStr[i]); //add
repeat=1;
}else{
//*pOutputStrRuler++='0'+repeat;
//*pOutputStrRuler++=pInputStr[i];
sprintf(pOutputStr,"%s%d%c",pOutputStr,repeat,pInputStr[i]); //add
repeat=1;
}
}
sprintf(pOutputStr,"%s\0",pOutputStr); //add
printf("%s\n",pOutputStr);
}
int main(){
char *pInputStr=(char *)malloc(20);
char *pOutputStr=(char *)malloc(20);
scanf("%s",pInputStr);
stringZip(pInputStr,strlen(pInputStr),pOutputStr);
system("pause");
return 0;
}