![](/img/trans.png)
[英]Run-Time Check Failure #2 - Stack around the variable 'IDNumber' was corrupted
[英]Run-Time Check Failure #2: Stack around the variable 'expression' was corrupted
以下是我将infix
转换为postfix
表示法的代码,以后的postfix
也正在评估中。 这段代码可以正常工作并给出正确的答案,但最后我在运行时遇到了此错误。
为什么会导致此错误? 我正在使用Viusal C++ 2010.
码:
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
int getPrecedence( char tmp )
{
if(tmp=='+')
{
return 1;
}
else if(tmp == '-')
{
return 1;
}
else if(tmp == '*')
{
return 2;
}
else if(tmp == '/')
{
return 2;
}
else if(tmp == '=')
{
return 0;
}
else if(tmp == '(')
{
return -1;
}
else if(tmp == ')')
{
return -1;
}
}
int main()
{
stack<char> st;
char expression[10];
cout<<"Enter expression : ";
//cin>>expression;
strcpy(expression,"x=(0+1)+(y=2+3)");
char postfix[100]; // its postfix string
int counter=0;
int i=0;
int bracketCheck = 0;
//(a+b)
while( expression[i] != '\0' ) // iterate till '/0' does not come.
{
if(expression[i]== '+' || expression[i]== '-' || expression[i]== '*' || expression[i]== '/' || expression[i]== '=' )
{
if( st.empty() )
{
st.push(expression[i]);
}
else // when stack not empty
{
int topPrecedence = getPrecedence( st.top() );
int expressionPrecedence = getPrecedence( expression[i] );
while( !(topPrecedence < expressionPrecedence) )
{
postfix[counter++] = st.top();
st.pop() ;
if(! st.empty() )
{
topPrecedence = getPrecedence( st.top() );
}
else
{
break;
}
}
//if( st.empty() )
//{
// st.push( expression[i] );
//}
if( topPrecedence < expressionPrecedence )
{
st.push( expression[i] );
}
}
}
else if( expression[i]=='(' )
{
st.push( expression[i] );
bracketCheck++;
}
else if( expression[i]==')' )
{
int topPrecedence = getPrecedence( st.top() );
int expressionPrecedence = getPrecedence( expression[i] );
while( topPrecedence >= expressionPrecedence) // +>=) --- 1 >= -1 ------- +>=) --- -1 >= -1
{
if( getPrecedence( st.top() ) != -1 )
{
postfix[counter++] = st.top();
}
char BracketFound = st.top();
st.pop();
if( !st.empty() )
topPrecedence = getPrecedence( st.top() );
if( st.empty() ) // break out of loop when stack is empty
break;
if( BracketFound == '(' )
break;
}
}
else // when its an alphabet
{
postfix[counter++] = expression[i];
}
i++;
} // outer while ends
while( ! st.empty() )
{
postfix[counter++] = st.top();
st.pop();
}
postfix[counter] = '\0';
i=0;
while( postfix[i] != '\0' )
{
cout<<postfix[i]<<" ";
i++;
}
stack<char> e; // eval stands for evaluation
i=0;
while( postfix[i] != '\0' )
{
if( postfix[i] == '+' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left + right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '-' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left - right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '*' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left * right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '/' )
{
int right = e.top();
right = right - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
left = left - 48;
e.pop();
int result = left / right;
result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( result );
}
else if( postfix[i] == '=' )
{
int right = e.top();
//left = left - 48; // 48 is ascii of 0 so 49-48=1
e.pop();
int left = e.top();
//right = right - 48;
e.pop();
//int result = right + left;
//result = result + 48; // sets to right ascii and in next line this ascii is type casted to char.
e.push( right );
}
else
e.push( postfix[i] );
i++;
}
// while ends
cout<<endl;
cout<<"result= "<<e.top()<<endl;
system("pause");
return 0;
}
好吧,我看到的第一个问题是您正在将15个字符+空终止符复制到expression [10]中。 基本上,您将16磅装满10磅重的麻袋。
char expression[10];
//<snip>
strcpy(expression,"x=(0+1)+(y=2+3)");
查看要复制到expression
的内容的长度(不要忘了尾随\\0
)。 您已经在数组中分配了10个空间,但是您试图在其中存储16个空间,并且缓冲区溢出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.