字符串压缩

题目描述:

       通过键盘输入一串小写字母(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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值