我在使用C ++转换类型时遇到了问题。我有一个表达式:string wholeExpression = "44*2";
我希望将数字与运算符分开。
如果它是一个运算符,我使用这部分代码:
string subExpression;
char skladnik;
subExpression = wholeExpression.substr(poczatek, lenght);
skladnik = subExpression[0];
如果是数字:
subExpression = wholeExpression.substr(poczatek, lenght);
skladnik = atoi(subExpression.c_str());
@EDIT
switch (skladnik)
{
case '+':
case '-':
{
while (topOfStack > 0 && stack[topOfStack - 1] != '(')
{
outPut += stack[topOfStack - 1] + przecinek;
stack.resize(topOfStack - 1);
topOfStack--;
}
stack += skladnik;
topOfStack++;
break;
}
case '/':
case '*':
{
while (topOfStack > 0 && (stack[topOfStack - 1] == '*' || stack[topOfStack - 1] == '/'))
{
outPut += stack[topOfStack - 1] + przecinek;
stack.resize(topOfStack - 1);
topOfStack--;
}
stack += skladnik;
topOfStack++;
break;
}
case '(':
{
stack += skladnik;
topOfStack++;
break;
}
case ')':
{
while (stack[topOfStack - 1] != '(')
{
outPut += stack[topOfStack - 1] + przecinek;
stack.resize(topOfStack - 1);
topOfStack--;
}
if (stack[topOfStack - 1] == '(')
{
stack.resize(topOfStack - 1);
topOfStack--;
}
break;
}
default:
{
outPut += to_string(skladnik) + przecinek;
break;
}
}
}
但突然间我遇到了40到43以及45和47的数字问题 - >哪些是运算符(ASCII码)。它们可能被开关解释为数字而不是oparators。另一个数字完美无缺。我该如何解决这个问题?
答案 0 :(得分:1)
您已回答了自己的问题。数字40的char
不存在。它有两个char
变量:4和0.因为您将int
放入带有atoi的char
,它将使用ASCII码。在不知道lenght
的价值的情况下,很难说这确实是您的问题,但这里有两种可能的解决方案:
atoi
。而是在switch语句之后将每个数字char
解释为实际的整数(4和0将是
atoi('4') * 10 + atoi('0')
)int
或long
或double
变量来保存您的号码。答案 1 :(得分:0)
您正在以两种不同的方式使用变量skladnik
。在一个代码路径中,它指的是解码的整数,在第二个代码路径中它指的是一个字符。一旦你将这样的含义混为一谈,一旦你处于switch
的含义,就没有办法告诉它。
您应该使用两个不同的变量,一个用于解码数字,另一个用于操作员字符。然后会有没有混淆。