将字符串转换为字符 我在C++中转换类型有问题。我有一个表达式:string wholeExpression=“44*2”我想把数字和运算符分开。 如果是运算符,我使用这部分代码: string subExpression; char skladnik; subExpression = wholeExpression.substr(poczatek, lenght); skladnik = subExpression[0];
如果是数字:将字符串转换为字符 我在C++中转换类型有问题。我有一个表达式:string wholeExpression=“44*2”我想把数字和运算符分开。 如果是运算符,我使用这部分代码: string subExpression; char skladnik; subExpression = wholeExpression.substr(poczatek, lenght); skladnik = subExpression[0];,c++,char,switch-statement,C++,Char,Switch Statement,如果是数字: subExpression = wholeExpression.substr(poczatek, lenght); skladnik = atoi(subExpression.c_str()); @编辑 但突然之间,我遇到了40到43、45和47之间的数字的问题,它们是运算符(ASCII码)。它们可能不是被开关解读为数字,而是被解读为运算放大器。另一个数字工作得很好。我怎样才能解决这个问题?您已经回答了自己的问题。数字40的char不存在。它是两个char
subExpression = wholeExpression.substr(poczatek, lenght);
skladnik = atoi(subExpression.c_str());
@编辑
但突然之间,我遇到了40到43、45和47之间的数字的问题,它们是运算符(ASCII码)。它们可能不是被开关解读为数字,而是被解读为运算放大器。另一个数字工作得很好。我怎样才能解决这个问题?您已经回答了自己的问题。数字40的
char
不存在。它是两个char
变量:4和0。由于使用atoi将int
放入char
,因此它将使用ASCII码。如果不知道长度的值,很难说这确实是您的问题,但这里有两种可能的解决方案:
atoi
。相反,在switch语句之后,将每个数字char
解释为一个实际整数(4和0将是
atoi('4')*10+atoi('0')
)int
或long
或double
变量保存数字您以两种不同的方式使用变量
skladnik
。在一个代码路径中,它指的是已解码的整数,在第二个代码路径中,它指的是字符。一旦你像这样把意思混为一谈,一旦你处于开关
,就无法判断它有什么意思
您应该使用两个不同的变量,一个用于解码的数字,另一个用于运算符字符。这样就不会有混淆。你能用实际的
开关来代替这个吗?这将更容易看到您的实现而不是伪代码;博士,这就是为什么我试图缩短它的正确工具来解决这些问题是你的调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。您需要保留两个不同的变量。试图用同一个变量来处理两件不同的事情是错误的。@Mikkey我在你的整个程序中没有看到一个isdigit()
。这让我相信你在这件事上完全错了。进行此操作的直观方法是1)通过调用isdigit
来检测您是否在一个数字的开头,如果是,则开始构建一个有效的数字,直到遇到的字符不是数字为止。你似乎只是编写了一些“临时”的东西,而没有对它进行任何真正的思考,或者至少没有在纸上列出一个计划。
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;
}
}
}