我正在尝试编写一个后缀计算器,但是我一直遇到两个问题:
第一:当计算器遇到一个空格时,它只是立即退出
第二:当遇到非运算符/非数字(即-z)时,它不会显示我编码的错误消息。

int main()
{

stack <int> calcStack;
string exp;
char ans;
cout << "\nDo you want to use the calculator?" << endl;
cin >> ans;
while (ans == 'y')
{
    cout << "\nEnter your exp" << endl;
    cin >> exp;
    for (int i = 0; i < exp.size(); i++)
    {
        if (isspace(exp[i]))
        {

        }
        else if (isdigit(exp[i]))
        {
            int num = exp[i] - '0';
            calcStack.push(num);
        }
        else
            doOp(exp[i], calcStack);
    }

    while (!calcStack.empty())
    {
        calcStack.pop();
    }

    cout << "\nDo you want to use the calculator again?" << endl;
    cin >> ans;
}

system("pause");
return 0;
}


这是功能-

void doOp(const char & e, stack <int>& myS)
{

if (myS.size() == 2)
{
    int num1, num2, answ;
    num2 = myS.top();
    myS.pop();
    num1 = myS.top();
    myS.pop();
    if (e == '+')
        answ = num1 + num2;
    else if (e == '-')
        answ = num1 - num2;
    else if (e == '*')
        answ = num1 * num2;
    else if (e == '/')
        answ = num1 / num2;
    else if (e == '%')
        answ = num1 % num2;
    else
        cout << "\nError- Invalid operator" << endl;

    cout << "\nCalculating..." << endl << answ << endl;
    myS.push(answ);
}
else
    cout << "\nInvalid stack size- too few, or too many" << endl;
}

最佳答案

在主循环中,您正在使用字符串提取器读取字符串:

    cin >> exp;


字符串提取器对空间敏感。因此,一旦在输入中遇到空格字符,字符串读取就会停止,并且witespace不包含在exp中。

如果要获得包含空格的完整行,则应选择:

    getline (cin, exp);


编辑:

当您询问用户是否要使用计算器时,您在getline()上遇到的问题会转化为字符提取。输入y是不够的。因此,您输入y输入。仅将y放入ans,以便getline()开始读取空行。

要解决此问题,请更新您的初始输入:

    cin >> ans;                   // as before
    cin.ignore (INT_MAX, '\n');   // add this to skip everything until newline included


这里的online demo表示它有效(包括错误消息,如果操作员输入错误)

关于c++ - 后缀符号计算器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36166958/

10-13 04:56