[英]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.