我正试图编写一个后缀计算器的代码,但我一直遇到两个问题-第一:当计算器遇到空格时,它会立即退出第二:当它遇到非运算符/非数字(即-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
这里有一个在线演示,显示它的工作原理(包括错误操作员的错误消息)