数学运算符未注册为输入

Math operators not registering as input?

本文关键字:输入 注册 运算符      更新时间:2023-10-16

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

我曾尝试在字符串中的第一个字符(即唯一的字符string.at(0))上使用isdigit(),但没有成功;它仍然返回true,并且计算机试图将字符串转换为十进制,从而导致崩溃。我将发布进行计算的函数,我用来将用户输入截断为字符串向量的方法,以及我用来检查有问题的字符串是否可以使用下面的stod转换为双精度的方法:

计算:

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;
}

CHECK IF NUMBER(写这个而不是使用isdigit,这样用户就可以输入小数,而不能输入类似3AJ的东西)

bool isNum(string input)
{
    int numDecimals = 0;
    int nonNumChars = 0;
    for(int i = 0; i < input.length(); i++)
    {
        char c = input.at(i);
        if(!isdigit(c))
        {
            switch(c)
            {
                case '.': numDecimals++; break;
                default: nonNumChars++; break;
            }
        }
    }
    if(numDecimals < 2 && nonNumChars == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

我为这篇文章的篇幅太长而道歉,只是想提前提供尽可能多的信息。我被难住了。请不要发布实际的代码来代替常规建议,也不要指出我做错了什么。如果你能帮助的话,我喜欢尽可能避免复制别人的代码。如果你照抄的话,那么乐趣和学习就少了。

问题不在于传递给stod的字符串,而在于数组索引。仔细观察你在哪里减少(和不减少)inputTokens