C++ 字符串计算器substr()

C++ 字符串计算器substr(),c++,string,C++,String,我正在创建一个字符串计算器,它应该是左关联的,并且没有运算符优先级。我的主要问题是,switch语句中的算法将我的字符串拆分为一个子字符串,然后将字符串的其余部分拆分为另一个子字符串,即表达式的其余部分。例如,10+3*6应该等于78,但它首先计算(3*6),然后加上10,得到的值为28,这是不正确的。有没有办法解决这个问题,使字符串表达式从左到右求值?提前谢谢 #include<iostream> #include<sstream> #include<string

我正在创建一个字符串计算器,它应该是左关联的,并且没有运算符优先级。我的主要问题是,switch语句中的算法将我的字符串拆分为一个子字符串,然后将字符串的其余部分拆分为另一个子字符串,即表达式的其余部分。例如,10+3*6应该等于78,但它首先计算(3*6),然后加上10,得到的值为28,这是不正确的。有没有办法解决这个问题,使字符串表达式从左到右求值?提前谢谢

#include<iostream>
#include<sstream>
#include<string>
#include<cctype>
#include<cmath>
using namespace std; 

enum {PLUS='+',MINUS='-',MULT='*'};

int numberValue(string &expr)
{
  istringstream is(expr);
  int value = 0;
  is >> value;
  return value;
}


int expressionValue(string &expr)
{
    for(int i = 0;i<expr.length();i++)
    {
        switch(expr.at(i))
        {
        case PLUS:
            return expressionValue(expr.substr(0,i)) + 
                expressionValue(expr.substr(i+1,expr.length()-i-1));
        case MINUS:

            return  expressionValue(expr.substr(0,i)) -
                expressionValue(expr.substr(i+1,expr.length()-i-1));
        case MULT:

            return  expressionValue(expr.substr(0,i)) *
                expressionValue(expr.substr(i+1,expr.length()-i-1));
        }
    }

    return numberValue(expr);
}

int main()
{
    string expressionString;
    cout << "Enter An expression: " << endl;
    cin >> expressionString;
    cout << expressionValue(expressionString) << endl;
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
枚举{PLUS='+',MINUS='-',MULT='*'};
整数数值(字符串和表达式)
{
istringstream是(expr);
int值=0;
是>>值;
返回值;
}
int表达式值(字符串和表达式)
{

对于(int i=0;i,您只需反转过程,以便递归将从左向右移动:

#include<iostream>
#include<sstream>
#include<string>
#include<cctype>
#include<cmath>
using namespace std; 

enum {PLUS='+',MINUS='-',MULT='*'};

int numberValue(string &expr)
{
istringstream is(expr);
int value = 0;
is >> value;
return value;
}


int expressionValue(string &expr)
{

for(int i=expr.length()-2;i>=0;i--) //assuming last character will not be an operand
{
{
    switch(expr.at(i))
    {
    case PLUS:
        return expressionValue(expr.substr(0,i)) + 
            expressionValue(expr.substr(i+1,expr.length()-i-1));
    case MINUS:

        return  expressionValue(expr.substr(0,i)) -
            expressionValue(expr.substr(i+1,expr.length()-i-1));
    case MULT:

        return  expressionValue(expr.substr(0,i)) *
            expressionValue(expr.substr(i+1,expr.length()-i-1));
    }
   }
}


return numberValue(expr);
}

int main()
{
string expressionString;
cout << "Enter An expression: " << endl;
cin >> expressionString;
cout << expressionValue(expressionString) << endl;
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
枚举{PLUS='+',MINUS='-',MULT='*'};
整数数值(字符串和表达式)
{
istringstream是(expr);
int值=0;
是>>值;
返回值;
}
int表达式值(字符串和表达式)
{
for(int i=expr.length()-2;i>=0;i--)//假设最后一个字符不是操作数
{
{
开关(expr.at(i))
{
案例补充:
返回expressionValue(expr.substr(0,i))+
expressionValue(expr.substr(i+1,expr.length()-i-1));
减号:
返回表达式值(expr.substr(0,i))-
expressionValue(expr.substr(i+1,expr.length()-i-1));
案例多:
返回表达式值(expr.substr(0,i))*
expressionValue(expr.substr(i+1,expr.length()-i-1));
}
}
}
返回数值(expr);
}
int main()
{
字符串表达式字符串;
cout表达式字符串;

你现在能发现为什么计算器被发明了吗?非常感谢你的帮助。我当时正试图搞乱substr(),甚至没有想到改变for循环。