一道c++编程题,写的一塌糊涂,看看错误,并帮忙改正。谢谢!

题目:定义一个字符串类cstring,并设计一个算法对该串中各个不同字符出现的频率进行统计。具体要求:(1)私有成员数据:char*str:指向要统计的字符串。char(... 题目:
定义一个字符串类cstring,并设计一个算法对该串中各个不同字符出现的频率进行统计。具体要求:
(1)私有成员数据:
char*str:指向要统计的字符串。
char(*p)[2]:动态分配二维空间,存放str指向字符串中出现的字符及出现的频率。(次数在存放时用该字符的ASCII值存放;在输出次数时,输出该ASCII字符对应的ASCII值即可。)
int size:存放字符串出现所有不同的字符的个数。
(2)共有成员函数
cstring(char*s):初始化str;p和size的初始值为0.
void count():p根据s所指向字符串分配空间。然后将str所指向的字符串中得每一个字符放入p,设置每个字符出现次数为1.根据p数组统计不同字符出现的频率,并求得size的实际大小。最后根据size的实际大小,重新分配p所指向的空间,并把不同字符及其出现的次数重新放回p数组(提示:可以借助临时数组或指针来实现)。
void show():屏幕上显示字符串、字符串的每个字符和对应的次数。
~cstring():释放动态分配的空间.
(3)main 函数完成测试。
#include<iostream.h>
#include<string.h>
class cstring{
char*str,(*p)[2];
int size;
public:
cstring(char*s){
str=new char[strlen(s)+1];
strcpy(str,s);
size=0;
}
void count(){
int k=61,a,b;
p=new char[strlen(str)+1][2];
for(int i=0;i<strlen(str);i++){
p[i][0]=str[i];
p[i][1]='\k';
}
for(i=0;p[i][0];i++){
k=61;
for(int j=i+1;p[j][0];j++)
if(p[i][0]==p[j][0]){
k++;
p[i][1]='\k';
a=j;b=j+1;
while((p[a++][0]))p[a][0]=p[b++][0];
}
size++;
}

}
void show(){
cout<<p<<'\n';
}
~cstring(){delete p;}
};
void main(){
char s[]="sfsfghjsfhggj";
cstring test(s);
test.count();
test.show();
}
展开
 我来答
kaixingui2012
2011-09-25 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6217万
展开全部
这道题按题目要求做真的挺麻烦的
我按照你的基础改了一下程序,你看看吧
#include<iostream>
#include<string.h>
using namespace std ;
class cstring{
char*str,(*p)[2];
int size;
public:
cstring(char*s){
str=new char[strlen(s)+1];
strcpy(str,s);
size=0;
p=NULL;
}
void count(){
char *ptmp=new char[strlen(str)+1];
char *pstr=str;
char *pstart=ptmp;
int i=0;

memset( ptmp , 0 , strlen(str)+1 );
//将str中出现的字符存放到ptmp中,不存入重复的字符,统计单字符个数size
while(*pstr)
{
if ( !strchr( pstart,*pstr ) ) //该字符不存在
{
*ptmp=*pstr;
ptmp++;
size ++ ;
}
pstr++;
}
//按size分配相应的二维数组空间
p=new char[size][2];
//给p数组赋初值
ptmp=pstart;
for( i=0;i<size;i++ )
{
p[i][0]=*ptmp; //第一位存放字符
p[i][1]='0'; //第二位存放次数ASCII, 限制:要求此字符出现的次数不能超过9次,否则,显示会不正确
ptmp++;
}

//再次扫描字符串,检查各字符出现的频率
pstr=str;
while(*pstr)
{
for( i=0;i<size;i++ )
{
if ( p[i][0]==*pstr )
{

p[i][1] += 1 ;
break;
}
}
pstr++;
}
//释放临时指针
delete ptmp;
}
void show(){
int i=0;
cout <<"str="<<str<<endl;
for( i=0;i<size ;i++ )
cout<<p[i][0]<<"出现的次数为:"<<p[i][1]<<endl;
}
~cstring(){delete p; delete str;}
};

int main(){
char s[]="sfsfghjsfhggj";
cstring test(s);
test.count();
test.show();
system("pause");
return 0;
}
追问
我把你的代码调试了下,运行崩溃了,有些语言我又看不懂,所以也不懂改
追答
你是什么环境,我在windows dev c++下调通过的啊
在linux下找到了问题: 不好意思,影响你了
//释放临时指针
delete ptmp;
这里不对了,ptmp没有指向原起始位置,修改如下:
//释放临时指针
delete pstart; //pstart一直记录着起始位置
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式