我目前正在用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
我为这篇文章的篇幅感到抱歉,只想尽可能多地提供信息。我很难过。如果你可以提供帮助,请不要发布实际代码来代替常规建议并指出我做错了什么,我喜欢避免抄袭其他人。代码尽可能。如果你复制,那就没有那么有趣和学习。
答案 0 :(得分:1)
问题不在于您传递给stod
的字符串中,而是在数组索引中。仔细查看你所做的事情(并且不要)减少inputTokens
。