c++写字符压缩的题目问题

wuyalu123 2015-04-15 02:24:11
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"


#include<iostream>
#include<string>
using namespace std;
void stringZip(const string &a, int num, string &b)
{

int i,j,k;int count;
k=0;
for(i=0;i<num;)
{ count=1;

for(j=i+1;j<num;j++)
{ if(a[i]!=a[j])
break;
count++;

}
if(count>1)
{
b[k++]=count;
b[k++]=a[i];

}
if(count==1)
b[k++]=a[i];
i=i+count;
}

}

int main()
{
string a;string b;
cin>>a;
int n=a.size();
stringZip(a,n,b);
cout<<b;
system("pause");
return 0;
}


我写了以上的代码,怎么运行老师出错?我觉得应该没问题啊,有人能帮忙看看嘛
...全文
230 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
PoirotLi 2015-04-15
  • 打赏
  • 举报
回复
http://www.litefeel.com/tools/ascii.php看看这个你应该就明白了
赵4老师 2015-04-15
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
引用 12 楼 u014287775 的回复:
我也就是个菜鸟,叫大神,我可受不起,;你打印的是字符,每个地址存放的都是字符的ASCII值,数字的ASCII值是这个数字的值加上0x30;你可以对照着ASCII码表看看就明白了~
我也突然发现这个问题了,我后来改成 count+'0';显示也正确 ,谢谢帮助了。
花花永不落幕 2015-04-15
  • 打赏
  • 举报
回复
我也就是个菜鸟,叫大神,我可受不起,;你打印的是字符,每个地址存放的都是字符的ASCII值,数字的ASCII值是这个数字的值加上0x30;你可以对照着ASCII码表看看就明白了~
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
引用 10 楼 u014287775 的回复:
b[k++]=(char)count; 改成b[k++]=(char)count+0x30;
大神,求指导,改了的确就正确了,但是为什么要这么改呢? 原来显示错误是什么问题,大神求解释啊!
花花永不落幕 2015-04-15
  • 打赏
  • 举报
回复
b[k++]=(char)count; 改成b[k++]=(char)count+0x30;
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
改成如下这样后能有运行结果,但是运行结果怎么不显示数字,显示的是一种怪怪的符号,比如应该显示2a,显示的是星号a;
#include<iostream>
#include<string>
using namespace std;
void stringZip(const string &a, int num, string &b)
{
	b=a;
	int i,j,k;int count;
	k=0;
	for(i=0;i<num;)
	{    count=1;
		  
		for(j=i+1;j<num;j++)
		{   if(a[i]!=a[j])
		     break;
			count++;
		    
	    }
	    if(count>1)
		{
			b[k++]=(char)count;
			b[k++]=a[i];

	    }
		if(count==1)
			b[k++]=a[i];
		i=i+count;
     }
	b.resize(k);
}

int main()
{
	string a;
	cin>>a;
	int n=a.size();
	string b;
	stringZip(a,n,b);
	cout<<b;
	system("pause");
	return 0;
}
yangyunzhao 2015-04-15
  • 打赏
  • 举报
回复
string不是用new 分配空间,用resize吧。stl很多地方都用这个的,例如vector
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
引用 5 楼 u014287775 的回复:
问题出在这里: if(count>1) { b[k++]=count; b[k++]=a[i]; } 你的string b 是空的,你直接用b[k++];会造成内存问题。
怎么才能避免这个问题呢?声明的时候用new给b分配足够的空间吗?
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
怎么才能避免这个问题呢?声明的时候用new给b分配足够的空间吗?
花花永不落幕 2015-04-15
  • 打赏
  • 举报
回复
问题出在这里: if(count>1) { b[k++]=count; b[k++]=a[i]; } 你的string b 是空的,你直接用b[k++];会造成内存问题。
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
有大神告诉我,我写的代码哪里有错误吗?我现在很疑惑啊
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
KMP是什么意思?大神能解释下吗
yangyunzhao 2015-04-15
  • 打赏
  • 举报
回复
建议参考KMP
wuyalu123 2015-04-15
  • 打赏
  • 举报
回复
有大神帮忙看看嘛?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧