数学运算符没有注册为输入?

时间:2015-12-30 20:58:28

标签: c++ string

我目前正在用C ++编写我的第一个RPN计算器,并且我遇到了一个严重的困境。当程序遇到数学运算符作为用户的输入时,它似乎无法理解它所看到的内容,并将其视为可以转换为数字的东西;我知道这是问题的最大部分,因为我收到的运行时错误告诉我有问题的字符串无法通过stod转换为小数。

我尝试在字符串中的第一个字符(即唯一的android { ... lintOptions { checkReleaseBuilds false abortOnError false } } )上使用isdigit()无效;它仍然返回true并且计算机尝试将字符串转换为小数,从而导致崩溃。 我会发布计算所在的函数,我用来将用户的输入截断为字符串向量的方法,以及我用来检查是否存在的方法有问题的字符串可以使用以下stod转换为double:

计算:

string.at(0)

截断字符串:

double calculate(string inputTemp)
{
    double result;

    //Truncate input into a digestible format via the truncation method
    vector<string> input = truncate(inputTemp);
    int inputTokens = input.size();
    stack<double> stk;
    double num1;
    double num2;
    int i = 0;

    while(inputTokens > 1)
    {
        if(isNum(input[i]))
        {
            cout << input[i] << " pushed to stack" << endl;
            stk.push(stod(input[i]));
            i++;
        }
        else
        {
            switch(input[i].at(0))
            {
                case '+':
                    num2 = stk.top();
                    stk.pop();
                    num1 = stk.top();
                    stk.pop();
                    stk.push(num1 + num2);
                    inputTokens--;
                    i++;
                    break;
                case '-':
                    num2 = stk.top();
                    stk.pop();
                    num1 = stk.top();
                    stk.pop();
                    stk.push(num1 - num2);
                    inputTokens--;
                    i++;
                    break;
                case '*': case 'x': case 'X':
                    num2 = stk.top();
                    stk.pop();
                    num1 = stk.top();
                    stk.pop();
                    stk.push(num1 * num2);
                    inputTokens--;
                    i++;
                    break;
                case '/':
                    num2 = stk.top();
                    stk.pop();
                    num1 = stk.top();
                    stk.pop();
                    stk.push(num1 / num2);
                    inputTokens--;
                    i++;
                    break;
                case '^':
                    num2 = stk.top();
                    stk.pop();
                    num1 = stk.top();
                    stk.pop();
                    stk.push(pow(num1, num2));
                    inputTokens--;
                    i++;
                    break;
                default: 
                    cout << "ERROR: invalid operator entered" << endl;
                    i++;
                    break;
            }
        }
    }

    result = stk.top();
    return result;
}

检查是否有数字(写了这个,而不是使用vector<string> truncate(string input) { vector<string> output(input.length()); for(int i = 0, j = 0; i < input.length(); i++) { char c = input.at(i); switch(c) { case ' ': j++; break; default: output[j] += c; break; } } while(output.back() == "") { output.pop_back(); } return output; } ,这样用户就可以输入小数,而用户也无法输入类似3AJ的内容。

isdigit

我为这篇文章的篇幅感到抱歉,只想尽可能多地提供信息。我很难过。如果你可以提供帮助,请不要发布实际代码来代替常规建议并指出我做错了什么,我喜欢避免抄袭其他人。代码尽可能。如果你复制,那就没有那么有趣和学习。

1 个答案:

答案 0 :(得分:1)

问题不在于您传递给stod的字符串中,而是在数组索引中。仔细查看你所做的事情(并且不要)减少inputTokens