例如输入2+3 形参a应该是#,b应该是+。把b打印在屏幕上 b确实是+,但是进入switch的b却是'/n'换行符,也有可能是getnext函数里输入没吞掉回车的问题。但是如果没吞掉回车,形参b和ch应该都是换行符,但是打印出来却是+不。知道为什么会这样,求大佬解答,如果有解决方案就更好了,谢谢各位。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int num[100];
char str[1000];
char judge(char a, char b) {
//printf("%c",b);
int i, j;
char pre[][7] = {
/*运算符之间的优先级制作成一张表格*/
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='} };
switch (a) {
case '+': i = 0; break;
case '-': i = 1; break;
case '*': i = 2; break;
case '/': i = 3; break;
case '(': i = 4; break;
case ')': i = 5; break;
case '#': i = 6; break;
}
switch (b) {
case '+': j = 0; break;
case '-': j = 1; break;
case '*': j = 2; break;
case '/': j = 3; break;
case '(': j = 4; break;
case ')': j = 5; break;
case '#': j = 6; break;
}
return pre[i][j];
}
int Operate(int a, char theta, int b) {
int i, j, result;
i = a;
j = b;
switch (theta) {
case '+': result = i + j; break;
case '-': result = i - j; break;
case '*': result = i * j; break;
case '/': result = i / j; break;
}
return result;
}
int getnext(int *n) {
char c;
*n = 0;
while ((c = getchar()) == ' ');
if (!isdigit(c)) {
*n = c;
return 1;
}
do {
*n = *n * 10 + (c - '0');
c = getchar();
} while (isdigit(c));
ungetc(c, stdin);
return 0;
}
int main()
{
int i = 0, j = 0;
char ch, c, x;
str[j] = '#';
j++;
int a, b, flag=-1;
str[j] = '#';
j++;
flag = getnext(&ch);
x = str[j - 1];
while (ch != '='|| x != '#')//str[j-1]是字符栈栈顶
{
if (flag == 0) {
num[i] = ch;
i++;
flag = getnext(&ch);
}
else
{
//printf("%c", ch);
switch (judge(str[j-1], ch))//问题出处
{
case '<'://栈顶元素优先级低
num[i] = ch; i++;
flag = getnext(&ch);
break;
case '='://脱括号并接受下一字符
j--;
flag = getnext(&ch);
break;
case '>':// 退栈并将运算结果入栈
c = str[j - 1]; j--;
b = num[i - 1]; i--;
a = num[i - 1]; i--;
num[i]=Operate(a, c, b); i++;
break;
}
}
x = str[j - 1];
}
c = num[i - 1];
printf("%d", c);
}