深圳市非深户中考政策:c++小问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/10 08:42:59
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <iomanip.h>

class stack
{
public:
char st[20];
char *top;
char *base;
char t;
stack()
{ int i;
for(i=0;i<=20;i++)st[i]='\0';
base=&st[0];
top=&st[0];
}
void push(char *e)
{ unsigned int l;
unsigned int i;
l=strlen(e);
if(l==1)
{ *top=*e;
top++;
}
else
{ for(i=0;i<l;i++)
{ *top=*e;
top++;
e++;
}
}
}
void pop()
{
top--;

}
char gettop()
{ char e;
e=*(top-1);
return e;

}
void prtbottom()
{ int i;
for(i=0;i<top-base;i++)
{ cout<<base[i];
}
}
void prttop()
{ int i;
for(i=top-base-1;i>=0;i--)
{ cout<<base[i];
}
}
};
stack str1;
stack str;
struct charter
{ char h[7];
char v[7];
char *chart[7][7];
}c;
void initchart()
{ int i,j;
strcpy(c.h,"+*^()i#");
strcpy(c.v,"ETFPetf");

for(i=0;i<8;i++)
for(j=0;j<8;j++)
{ c.chart[i][j]="\0";
}
c.chart[0][3]="Te";
c.chart[0][5]="Te";
c.chart[1][3]="Ft";
c.chart[1][5]="Ft";
c.chart[2][3]="Pf";
c.chart[2][5]="Pf";
c.chart[3][3]="(E)";
c.chart[3][5]="i";
c.chart[4][0]="+Te";
c.chart[4][5]="$";
c.chart[4][6]="$";
c.chart[5][0]="$";
c.chart[5][1]="*Ft";
c.chart[5][4]="$";
c.chart[5][6]="$";
c.chart[6][0]="$";
c.chart[6][1]="$";
c.chart[6][2]="^Pf";
c.chart[6][4]="$";
c.chart[6][6]="$";
}

void main()
{ initchart();
str.push("#)i+i(^i*i+i");
str1.push("#E");
str1.push("test");
cout<<str.st<<endl;
cout<<str1.st<<endl;;
}

这里有问题啊。高手过来看看
调试好了告诉我。
表面看起来是内存地址一样引起的冲突,但是不知道为什么冲突的。
c.chart[0][0]的地址和str1.base还是top的地址一样。
不知道为什么。
大家帮忙看看
我怀疑那个堆栈类写的不好。

---------------------------------------------------------------------------
2005.5.14补充
"Te"是一个常量是吧?也存在作用范围?如果出了范围的话这个常量就消失了是吧?
用一个字符指针指向"Te"。如果出了范围的话。 那也就是指针指向一个非法的内存空间是吧?
还有肯定不是数组大小的问题。改成8也一样不好使。
以后还是尽量少使指针吧。除非非常明白
---------------------------------------------------------------------------

不同意楼上,Stack的构造函数已经给top赋了初值!

出错的是initchart()!在main()里把这个函数屏蔽掉就没错了,可见是它的错。
看看你的struct charter
{
char h[7];
char v[7];
char *chart[7][7]; //就是这个定义不妥
}c;
在赋值的时候你是这样赋的:
c.chart[0][3]="Te";
c.chart[0][5]="Te";
这里有个大忌,你把局部量"Te"赋给全局指针。要知道字符串"Te"在退出函数时就被自动释放了。
我试了,你把
char *chart[7][7];
改成
char chart[7][7][3];
再把
c.chart[0][3]="Te";
...
c.chart[6][6]="$";
改成
sprintf(c.chart[0][3],"Te");
...
sprintf(c.chart[6][6],"$");

就可以运行了!

如果你不怕麻烦,可以还用原来的定义再动态分配内存,这样更漂亮。

if(l==1)
{ *top=*e;
top++;
}
else
{ for(i=0;i<l;i++)
{ *top=*e;
top++;
e++;
}

*top=*e;
会报异常
回答者:负家子弟 - 经理 五级 5-10 16:57
确实是。。
在构造函数中已经赋值了。。
是我没注意到。。
不好意思
我只是简单调试一下
结果在那里出异常
我就以为是指针没有赋初值
是我失误
抱歉
但是至于哪里出错了
我也不太同意你的观点
我看没那么复杂
只是数组缓存设小了
以至于数据溢出了
char h[7];
char v[7];
char *chart[7][7];
改成
char h[8];
char v[8];
char *chart[8][8];
就应该没问题了
至于你说的局部量"Te"赋给全局指针问题
好像并不存在吧
这里并不是指针操作
是给指针指向的地址直接赋值了