【C语言】莫名其妙的暂停

初奋斗 2016-04-14 11:41:41

程序停在那里动不了了,求解。

以下是源程序。大致是用数组构造了栈,然后写一个表达式求值的函数。
程序处于调试阶段。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFSIZE 20

typedef double ELEMTYPE;//top&base's type can be changed for use
typedef struct
{
ELEMTYPE *base;
ELEMTYPE *top;
int stackSize;
}SQSTACK,*SQSTACKP;

SQSTACKP initstack(SQSTACKP sqstack);
int isfull(SQSTACKP sqstack);
int isempty(SQSTACKP sqstack);
int push(SQSTACKP sqstack,ELEMTYPE elem);
ELEMTYPE* pop(SQSTACKP sqstack);
ELEMTYPE* gettop(SQSTACKP sqstack);
int addroom(SQSTACKP sqstack,int howmuch);
char* numjudge(SQSTACKP sqstack,char *ch);
int oprchange(char *ch);
int oprpriority(int ch,int top);
int calculation(SQSTACKP sqstack,double *right,int opr,double *left);
int expressionevaluation(char *ques,double *answ);

void main()
{
char *buf=(char*)malloc(55*sizeof(char)),*ques=buf;
double *answ=(double*)malloc(sizeof(double));
printf("input your expression:");
if(fgets(buf,50,stdin)==NULL) exit(1);
printf("the answer is:");
if(expressionevaluation(ques,answ)==1) printf("%ld\n",*answ);
getchar();
free(answ);
free(buf);
}

SQSTACKP initstack(SQSTACKP sqstack)//initialise
{
sqstack=(SQSTACKP)malloc(sizeof(SQSTACK));
if(!sqstack) return NULL;
(*sqstack).base=(ELEMTYPE*)malloc(DEFSIZE*sizeof(ELEMTYPE)+1);//one more nod as final,avoid wild pointer
if(!(*sqstack).base) return NULL;
(*sqstack).top=(*sqstack).base;
(*sqstack).stackSize=DEFSIZE;
return sqstack;
}//initstack

int isfull(SQSTACKP sqstack)//full return 1,not full return -1
{
if((*sqstack).top==((*sqstack).base+(*sqstack).stackSize)) return 1;//full condition
return -1;
}//isfull

int isempty(SQSTACKP sqstack)//empty return 1,not empty return -1
{
if((*sqstack).base==(*sqstack).top) return 1;
return -1;
}//isempty

int push(SQSTACKP sqstack,ELEMTYPE elem)//success return 1,fail return -1
{
if(isfull(sqstack)==1)
if(addroom(sqstack,5)==-1) return -1;
*(*sqstack).top++=elem;
return 1;
}//push

ELEMTYPE* pop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return NULL;//error
return --(*sqstack).top;
}//pop

ELEMTYPE* gettop(SQSTACKP sqstack)
{
if(isempty(sqstack)==1) return NULL;
return ((*sqstack).top-1);
}//gettop

int addroom(SQSTACKP sqstack,int howmuch)
{
void *temp;
if((*sqstack).stackSize>=1000) return -1;//too much memory is not allowed
temp=(ELEMTYPE*)realloc((*sqstack).base,sizeof(ELEMTYPE)*((*sqstack).stackSize+howmuch+1));
if(!temp) return -1;
(*sqstack).base=temp;
(*sqstack).stackSize=(*sqstack).stackSize+howmuch;
return 1;
}//addroom

int oprpriority(int ch,int top) //new-top
{
if(ch==-1 || top==-1) return -1;//parameter error
switch(top)
{
case 43:if(ch==42||ch==47||ch==40) return 62;else return 60;break;
case 45:if(ch==42||ch==47||ch==40) return 62;else return 60;break;
case 42:if(ch==40) return 62;else return 60;break;
case 47:if(ch==40) return 62;else return 60;break;
case 40:if(ch==41) return 61;else if(ch==35) return -1;else return 60;break;
case 41:if(ch==40) return -1;else return 60;break;
case 35:if(ch==35) return 61;else if(ch==41) return -1;else return 62;break;
default:return -1;
}//用ascii码来代替运算符
}

int oprchange(char *ch)
{
switch(*ch)
{
case '+':return 43;break;
case '-':return 45;break;
case '*':return 42;break;
case '/':return 47;break;
case '#':return 35;break;
case '(':return 40;break;
case ')':return 41;break;
default:return -1;
}
}

char* numjudge(SQSTACKP sqstack,char *ch)//return remaining strings
{
double sum=0,floa=0;
int temp=0;
while(*ch>='0' && *ch<='9')
sum=sum*10+(*ch++)-'0';
if((*ch)=='.')
{
ch++;
while(*ch>='0' && *ch<='9')
{
floa=floa*10+(*ch++)-'0';
temp++;
}
while(temp--)
floa=floa/10;
}
push(sqstack,sum+floa);
return ch;
}

int calculation(SQSTACKP sqstack,double *right,int opr,double *left)
{
if(opr==-1 || sqstack==NULL || right==NULL || left==NULL) return -1;
switch(opr)
{
case 43:if(push(sqstack,*left + *right)==1) return 1;else return -1;break;
case 45:if(push(sqstack,*left - *right)==1) return 1;else return -1;break;
case 42:if(push(sqstack,*left * *right)==1) return 1;else return -1;break;
case 47:if(push(sqstack,*left / *right)==1) return 1;else return -1;break;
default:return -1;
}
}

int expressionevaluation(char *ques,double *answ)//operand 操作数,operator 运算符
{
SQSTACKP opd=NULL,opr=NULL;
opd=initstack(opd);
opr=initstack(opr);
if(push(opr,35)==-1) return -1;//'#' is 35
while(*ques && *ques!=' ')
{
if(*ques>='0' && *ques <='9')
ques=numjudge(opd,ques);
else
{
switch(oprpriority(oprchange(ques),(int)*gettop(opr)))//new-top
{
case 62:push(opr,oprchange(ques));break;//'>'
case 60:if(calculation(opd,pop(opd),(int)*pop(opr),pop(opd))==-1) return -1;break;//'<'
case 61:if(*ques==')') pop(opr);else {*answ=*pop(opd);return 1;}break;
default:return -1;
}
ques++;
}
}
free(opd);
free(opr);
return -1;
}
...全文
393 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
旧剑鞘 2016-04-15
  • 打赏
  • 举报
回复
while(*ques && *ques!=' ') { if(*ques>='0' && *ques <='9') ques=numjudge(opd,ques); else { switch(oprpriority(oprchange(ques),(int)*gettop(opr)))//new-top { case 62:push(opr,oprchange(ques));break;//'>' case 60:if(calculation(opd,pop(opd),(int)*pop(opr),pop(opd))==-1) return -1;break;//'<' case 61:if(*ques==')') pop(opr);else {*answ=*pop(opd);return 1;}break; default:return -1; } ques++; } } 粗略看看, else里写的ques++,if条件满足后看看有机会结束循环么?得断点调试啊~~ 死循环了还能找不到哪里问题
LubinLew 2016-04-15
  • 打赏
  • 举报
回复
程序是正常结束的,只是没有输出结果,停在了getchar() 那里
赵4老师 2016-04-15
  • 打赏
  • 举报
回复
在红圆圈上点鼠标左键。
paschen 2016-04-15
  • 打赏
  • 举报
回复
你不想要他每次停在那里就把那个断点去掉
小灸舞 版主 2016-04-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
初奋斗 2016-04-15
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
你不想要他每次停在那里就把那个断点去掉
,不是俺不会用断点,是run完之后它GG了
初奋斗 2016-04-15
  • 打赏
  • 举报
回复
引用 5 楼 lgbxyz 的回复:
程序是正常结束的,只是没有输出结果,停在了getchar() 那里
非也
初奋斗 2016-04-15
  • 打赏
  • 举报
回复
引用 6 楼 yuelengdihai 的回复:
char *buf=(char*)malloc(55*sizeof(char)),*ques=buf;
    double *answ=(double*)malloc(sizeof(double));
有问题吧
请问问题在哪里
cocoabird 2016-04-15
  • 打赏
  • 举报
回复
char *buf=(char*)malloc(55*sizeof(char)),*ques=buf;
    double *answ=(double*)malloc(sizeof(double));
有问题吧

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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