题目
通过键盘输入一串小写字母(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”
输入:“pppppppp” 输出:“8p”
解题思路
-
统计每个字母后面连续重复出现的次数num(即字母个数-1);
-
若num>0,将num+1转换成字符串,复制到pOutputStr中;
-
在pOutputStr后添加相应的字母。
源程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXCHAR 256
void stringZip(const char* pInputStr, long lInputLen, char* pOutputStr)
{
int i, j, k, num;
char buffer[20];
for(i = 0, k = 0; i < lInputLen; )
{
num = 0;
for(j = i + 1; j < lInputLen; ++j)
{
if(pInputStr[i] == pInputStr[j]) //统计每个字母后面连续重复出现的次数
++num;
else
break;
}//for
if(0 != num) //num可能是两位或三位或更多位的整数
{
memset(buffer, 0, sizeof(buffer));
itoa(num + 1, buffer, 10); //将整数按10进制转换为字符串
strcpy(pOutputStr + k, buffer); //复制字符串到pOutputStr + k开始的地址空间
k += strlen(buffer);
}
pOutputStr[k++] = pInputStr[i];
i = i + num + 1;
}//for
pOutputStr[k] = '\0';
}
int main(void)
{
char pInputStr1[] = {"aaaaaaaaaaaabbcddddddddddddddddde"};
char pOutputStr1[MAXCHAR] = {0};
stringZip(pInputStr1, strlen(pInputStr1), pOutputStr1);
puts(pOutputStr1);
return 0;
}