通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
重点的地方:
if(count!=1)
{
j=count+'0';
outstr[k++]=j;
}
把整形 转换成 字符类型
同类的,字母转换成整形:
‘1’-‘0’==1 减字符‘0’
#include<iostream>
using namespace std;
void stringzip(char *str,int len,char *outstr);
int main()
{
char str[20];
gets(str);
int len=strlen(str);
char outstr[20];
stringzip(str,len,outstr);
cout<<outstr<<endl;
system("pause");
return 0;
}
void stringzip(char *str,int len,char *outstr)
{
int count=1;
int k=0;
char j;
for(int i=0;i<len;i++)
{
if(str[i]==str[i+1])
{
count++;
}
else
{
if(count!=1)
{
j=count+'0';
outstr[k++]=j;
}
outstr[k++]=str[i];
count=1;
}
}
outstr[k]='\0';
}
这个代码有问题,发现如果字符超过10个的时候,无法显示个数,所以更改为:
#include<iostream>
using namespace std;
void stringzip(char *str,int len,char *outstr);
int main()
{
char str[20];
gets(str);
int len=strlen(str);
char outstr[20];
stringzip(str,len,outstr);
cout<<outstr<<endl;
system("pause");
return 0;
}
void stringzip(char *str,int len,char *outstr)
{
int count=1;
int k=0,temp,n=0;
char j;
char temp_str[20];
for(int i=0;i<len;i++)
{
if(str[i]==str[i+1])
{
count++;
}
else
{
if((count!=1) && (count<10))
{
j=count+'0';
outstr[k++]=j;
}
else if( (count!=1)&&(count>10) )
{
while(count) //将计数器(整型)字符化
{
temp=count%10;
j=temp+'0';
temp_str[n++]=j;
count=count/10;
}
while(n) //将其调转过来
{
outstr[k++]=temp_str[n-1];
n--;
}
n=0;
}
outstr[k++]=str[i];
count=1;
}
}
outstr[k]='\0';
}
参考答案:
/************************************************************************/
/*
编程题第二题
*/
/************************************************************************/
/*
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
*/
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
long repeat = 1;
long k = 0;
for(long i = 0; i < lInputLen; ++i)
{
char c = pInputStr[i];
if(i + 1 < lInputLen && c == pInputStr[i + 1])
{
++ repeat;
}
else
{
// 写入
if(repeat != 1)
{
// 当心repeat超过9的情况
char temp[100];
itoa(repeat, temp, 10);
int ii = 0;
while(temp[ii])
{
pOutputStr[k++] = temp[ii++];
}
}
pOutputStr[k++] = c;
repeat = 1;
}
}
pOutputStr[k] = 0;
}
/************************************************************************/
/*