C++ 后缀符号计算器

C++ 后缀符号计算器,c++,calculator,postfix-notation,C++,Calculator,Postfix Notation,我试图编写一个后缀计算器,但我一直遇到两个问题- 第一:当计算器遇到一个空格时,它会立即退出 第二:当它遇到非运算符/非数字(ie-z)时,它不会显示我编码的错误消息 int main() { stack <int> calcStack; string exp; char ans; cout << "\nDo you want to use the calculator?" << endl; cin >> ans; while (ans == '

我试图编写一个后缀计算器,但我一直遇到两个问题- 第一:当计算器遇到一个空格时,它会立即退出 第二:当它遇到非运算符/非数字(ie-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;
}
intmain()
{
堆栈计算堆栈;
字符串表达式;
查尔安斯;
库坦斯;
而(ans=='y')
{
cout-exp;
对于(int i=0;i
这就是函数--

void doOp(const char&e、stack&myS)
{
如果(myS.size()==2)
{
int num1、num2、answ;
num2=myS.top();
myS.pop();
num1=myS.top();
myS.pop();
如果(e=='+')
answ=num1+num2;
else如果(e='-')
answ=num1-num2;
else如果(e=='*')
answ=num1*num2;
else如果(e=='/'))
answ=num1/num2;
如果(e='%'),则为else
answ=num1%num2;
其他的

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

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

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

    getline (cin, exp);  
编辑:

当您询问用户是否想要使用计算器时,您遇到的
getline()
问题与字符提取有关。输入
y
是不够的。因此您将输入
y
enter。只有
y
将被放入
ans
,以便
getline()
将开始读取空行

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

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

这里显示了它的工作原理(包括错误运算符时的错误消息)

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

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

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

    getline (cin, exp);  
编辑:

当您询问用户是否想要使用计算器时,您遇到的
getline()
问题与字符提取有关。输入
y
是不够的。因此您将输入
y
enter。只有
y
将被放入
ans
,以便
getline()
将开始读取空行

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

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

此处显示其工作情况(包括错误操作员情况下的错误消息)

当您使用调试器,一次执行一条语句时,是哪条语句导致了问题?请记住,当您将数据从
cin
读取到
std:string
对象时,空格被视为两个值之间的分隔。请参阅,这会导致空格问题--37*9-因此3*7可以工作,而不是-9如果我尝试说37*n+,而不是告诉我无效的表达式,它会说无效的大小。尝试了getline(cin,exp)。它跳过了所有内容并返回到while循环。还尝试了cin.getline(exp,sizeof(exp))。编译器不会让我运行它。当我将exp转换为char[100]时,它会给出一个错误,cin.getline工作,但代码退出时出现断言失败。当您使用调试器,每次执行一条语句时,是哪条语句导致了问题?请记住,当您将数据从
cin
读取到
std:string
对象时,空格被视为两个值之间的分隔。请参阅这会导致速度问题--37*9-所以3*7可以工作,但-9不行。另外,如果我尝试说37*n+,而不是告诉我无效的表达式,它会说无效的大小。尝试过getline(cin,exp)。它跳过了所有内容并返回while循环。还尝试过cin.getline(exp,sizeof(exp)).编译器不允许我运行它。当我将exp转换为char[100]时,它会给出一个错误,cin.getline可以工作,但代码退出时出现断言失败。当我尝试这种方法时,编译器完全跳过允许用户输入表达式的操作,直接进入while循环检查。请使用getline(cin,exp)提供正在解析的表达式好吗我无法输入表达式。输出显示:请输入表达式:然后它会询问用户是否要使用计算器当我尝试此方法时,编译器完全跳过允许用户输入表达式的操作,并直接进入while循环检查是否可以提供正在解析的表达式?使用getline(cin,exp)我无法输入表达式。输出显示:请输入表达式:然后询问用户是否要使用计算器