C语言实现中缀转后缀表达式运算符显示异常及编译警告问题
C语言中缀转后缀表达式问题排查
问题描述
实现中缀(infix)表达式转后缀(postfix)表达式功能时,遇到两类异常:
- 输入测试用例
a+b时,输出结果为ab?,无法正常显示运算符 - 编译阶段出现如下警告:
infpos.c:74:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
问题定位结果
已排查到核心问题:代码第58行原本使用后缀自增运算符,实际应当使用前缀自增运算符。
原始代码
#include<stdio.h> #include<ctype.h> #define max 30 void main() { char inf[30],post[30]; void convert(char [],char []); printf("Enter the infix exxpression\n"); scanf("%s",inf); convert(inf,post); printf("Postfix expression is\n"); printf("%s\n",post); } void convert(char inf[],char post[]) { int i,j=0,top=-1,f=1,test; char stack[30],ch,x; int check(char); int pre(char); for(i=0;inf[i]!='\0';i++) { ch = inf[i]; test = check(ch); switch(test) { case 1: post[j++] = ch; break; case 2: stack[++top] = ch; break; case 3: while((x=stack[top--])!='(') post[j++] = x; break; case 4: do { if(top==-1) f = 1; else if(stack[top] == '(') f = 1; else if(pre(ch)>pre(stack[top])) f = 1; else { post[j++] = stack[top--]; f = 0; } }while(f==0); stack[top++] = ch; break; } } while(top!=-1) post[j++] = stack[top--]; post[j] = '\0'; } int pre(char op) { if(op == '+' || op=='-') return 1; else if(op == '/' || op=='*' || op =='%') return 2; else if(op=='^') return 3; } int check(char ch) { if(isalnum(ch)) return 1; else if(ch=='(') return 2; else if(ch == ')') return 3; else if(ch == '+' || ch =='-' || ch=='/' || ch =='*' || ch=='%' || ch=='^') return 4; else return 5; }
异常原理说明
1. 运算符显示乱码的原因
后缀自增top++的逻辑是先取top的当前值使用,再执行自增。处理第一个运算符时top初始值为-1,使用后缀自增会先向非法的stack[-1]内存地址写入运算符,之后top才自增为0,运算符实际没有存入栈的合法位置。后续出栈操作读取的是栈内存中的随机值,因此会输出?类乱码。改为前缀自增++top后,会先将top自增到合法下标再写入数据,问题即可解决。
2. 编译警告的原因
pre函数没有覆盖所有返回分支,如果传入的参数不是预设的运算符,函数没有对应的return语句,因此触发了非void函数返回值不全的警告。在pre函数末尾添加return 0;这类默认返回语句即可消除警告。
内容的提问来源于stack exchange,提问作者A_01_Abhilash S Hathwar
相关产品推荐
相关产品推荐

