C 如何计算算术表达式,如:';10+;2-4/2';

C 如何计算算术表达式,如:';10+;2-4/2';,c,C,我的程序有点小问题。我需要对算术表达式求和,例如:10+2+1/2,仅使用递归 我写了这样的东西: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int calculate(const char* expr, float *result); int calculate_rec(const char* expr, float *result

我的程序有点小问题。我需要对算术表达式求和,例如:10+2+1/2,仅使用递归

我写了这样的东西:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int calculate(const char* expr, float *result);
int calculate_rec(const char* expr, float *result, int i, char sg, int number);

int main(void){
  char expression[201]={0};
  char *expr=expression;
  float result;
  float *res=&result;
  printf("enter operation: ");
  fgets(expr, 201, stdin);
  fflush(stdin);

  calculate(expr, res);
  printf("%.2f", result);

  return 0;
}

int calculate(const char* expr, float *result){
   if(expr==NULL) return 0;
   calculate_rec(expr, result, 0, 0, 0);

  return 1;
}

int calculate_rec(const char* expr, float *result, int i, char sg, int number){
  if(isdigit(*(expr+i))) number=number*10+*(expr+i)-'0';
  else{
    switch(sg){
     case '+': *result += number;
     break;
     case '-': *result -= number;
     break;
     case '*': *result *= number;
     break;
     case '/': if(number==0) return 0;
        *result /= number;
     break;
    }
     number = 0;
     sg = *(expr + i);
   }
  if (*(expr + i)=='\0') return 1;
  return calculate_rec(expr, result, i + 1, sg, number);
}
#包括
#包括
#包括
#包括
int计算(常量字符*表达式,浮点*结果);
int calculate_rec(常量字符*expr,浮点*result,int i,字符sg,int number);
内部主(空){
字符表达式[201]={0};
char*expr=表达式;
浮动结果;
float*res=&result;
printf(“输入操作:”);
fgets(expr,201,stdin);
fflush(stdin);
计算(expr,res);
printf(“%.2f”,结果);
返回0;
}
int计算(常量字符*表达式,浮点*结果){
if(expr==NULL)返回0;
计算_rec(expr,result,0,0,0);
返回1;
}
int calculate_rec(常量字符*expr,浮点*result,int i,字符sg,int number){
如果(isdigit(*(expr+i)))编号=编号*10+*(expr+i)-'0';
否则{
开关(sg){
案例“+”:*结果+=数字;
打破
案例“-”:*结果-=编号;
打破
案例“*”:*结果*=编号;
打破
大小写“/”:如果(number==0)返回0;
*结果/=数字;
打破
}
数字=0;
sg=*(expr+i);
}
如果(*(expr+i)='\0'),则返回1;
返回计算记录(表达式、结果、i+1、sg、数字);
}

该程序工作正常,但跳过给定字符串中的第一个数字,从字符串:10+1+2/2,结果是1.5,应该是6.5。

递归遍历列表并执行乘法和除法运算,
并将左侧值替换为零,将运算符替换为加号,将右侧值替换为该值。然后递归地再次遍历列表并执行加法和减法运算。

fflush(stdin)
在标准C中是未定义的行为。
*(expr+i)
可以更简单、更习惯地写成
expr[i]
*result+=number-未初始化时使用结果。解析第一个数字时,只需设置
*result=number
。跳过它,立即转到
+2
执行
*result+=number。感觉您可以将另一个
,bool result\u initialized
变量传递给您的函数,然后在切换之前执行
if(result\u initialized==false){result\u initialized=true;*result=number}else开关(sq){..
注意,在仅输入流上调用
fflush
(如
stdin)
在C规范中被明确提到为未定义的行为。有一个实现将其添加为不可移植的扩展,因此请不要使用它。使用
-Wall-Wextra-Werror
(或编译器输出警告的任何选项)如果你自己去发现其中一些错误,你可能会发现很难看到这个答案的有用性,因为你所描述的可能正是他们试图做的。你可能会通过解释更多,可能会添加一些代码来让有用的部分更加明显。或者强调OP编码与你所描述的不同之处。i忘了加上操作的优先级不重要,一个接一个地做