C++ atoi未正确转换字符串?

C++ atoi未正确转换字符串?,c++,stack,atoi,rpn,C++,Stack,Atoi,Rpn,因此,对于中缀到后缀表达式转换器和计算器,我有以下(拙劣的!)代码(正如我在上一篇文章中提到的:,谢谢大家!): #包括 #包括 #包括 使用名称空间std; int main() { 堆栈运算符; 堆栈输出; 堆栈温度; 堆栈应答; 字符串命令; cout>命令; //“调车场”算法 //资料来源:http://en.wikipedia.org/wiki/Shunting-yard_algorithm 对于(int i=0;i替换此部分代码: if(temp.top() == '+')

因此,对于中缀到后缀表达式转换器和计算器,我有以下(拙劣的!)代码(正如我在上一篇文章中提到的:,谢谢大家!):

#包括
#包括
#包括
使用名称空间std;
int main()
{
堆栈运算符;
堆栈输出;
堆栈温度;
堆栈应答;
字符串命令;
cout>命令;
//“调车场”算法
//资料来源:http://en.wikipedia.org/wiki/Shunting-yard_algorithm

对于(int i=0;i替换此部分代码:

if(temp.top() == '+')
    {
        int a = atoi(&answer.top());
        cout << "A=" << a << endl;
        answer.pop();
        int b = atoi(&answer.top());
        cout << "B=" << b << endl;
        answer.pop();
        answer.push(b+a);
    } 
if(temp.top()=='+')
{
inta=atoi(&answer.top());

这里有两个问题

第一:

int a = atoi(&answer.top());
atoi接受指向以null结尾的字符串的指针。但是&answer.top()只是指向单个字符的指针。因此,atoi将开始从该字符读取,然后继续在内存中移动,直到找到“\0”字符(或非数字)。根据堆栈在您的平台上的实现方式,这可能意味着它先读取“4”,然后读取“3”,然后读取“\0”,最后以“43”结尾。或者它可能读取“4”,然后读取一些未初始化的内存,这些内存恰好以“8675309j”开头,最后以“48675309”结尾

如果您想知道为什么编译器没有警告您这个错误,那么问题是C样式的字符串和指向单个字符的指针在语法上是完全相同的类型(char*)所以编译器不能告诉你把它们混在一起,除非它理解了ATOI的语义。这是使用C++字符串类和函数而不是基于C char的函数的原因之一。 第二:

answer.push(b+a);

b+a是一个int,但你将它放入一堆字符中。因此,即使它有正确的值,你也会将字符“\007”,而不是字符“7”。你需要重新设置它的字符串。但在这种情况下,你显然得到了类似305419814的东西,它被截断为低8位(38)当转换为char时,38是“&”。

它可以工作!但是现在我似乎无法将(b+a)推入堆栈(它是空的)。有什么帮助吗?这行不通。如果堆栈有'4'和'3',你将得到a=4,b=3,a+b=7,然后按'\007',而不是'7'。danielpontello:虽然这段代码实际上不起作用,但你的问题没有多大意义。按到空堆栈上应该不会有任何问题。你得到的确切错误是什么?应该是什么如果你加上,比如说,6+7?一个简单的实现会得到“=”,这可能不是你想要的…但你想要什么?滚动到3,固定在9,使用base-36并打印“C”?
int a = atoi(&answer.top());
answer.push(b+a);