【发布时间】:2020-09-11 21:42:01
【问题描述】:
我正在尝试使用命令行输入编写一个简单的数学表达式解析器。表达式将仅包含 +-*/ 操作,并且从左到右进行计算。
#include <stdio.h>
#include <stdlib.h>
//does not work for double digit inputs
int main (int argc, char *argv[])
{
if (argc == 1)
{
printf("\n======================================================== \n");
printf("Invalid usage: <ProgramName>.exe <MathExpression:string> \n");
printf("eg: 2+3/5*9 \n");
printf("======================================================== \n");
return 0;
}
char *expr = argv[1];
float answer = (float)expr[0]-'0';
for (int i = 2; i < strlen(expr); i+=2) {
if (expr[i-1] == '+')
answer += (float)expr[i]-'0';
else if (expr[i-1] == '-')
answer -= (float)expr[i]-'0';
else if (expr[i-1] == '*')
answer *= (float)expr[i]-'0';
else if (expr[i-1] == '/')
answer /= (float)expr[i]-'0';
}
printf("answer: %.2f", answer);
}
我编写的程序适用于单个数字输入,例如 3+4+5,但不适用于 10 以上的输入(例如 10+11+12)。知道如何解决这个问题吗?
【问题讨论】:
-
可能想看看Shunting-yard algorithm。
-
您将每个数字视为一个数字 (
expr[i]-'0')。如果要支持多位数字,则必须实际解析字符串。 -
如果你需要尊重操作的顺序,这种幼稚的方法是行不通的。您需要将表达式解析为树或将其转换为 Reverse Polish Notation 之类的内容。