Ошибка проверки времени выполнения # 2: стек вокруг переменной 'expression' поврежден

0

Ниже приведен мой код для преобразования infix в postfix нотацию, а затем postfix. Этот код работает нормально и дает правильный ответ, но в конце я получаю эту ошибку во время выполнения.

Почему эта ошибка возникает? Я использую Viusal C++ 2010.

Изображение 174551

Код:

#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;
}
  • 1
    «x = (0 + 1) + (y = 2 + 3)» содержит более 10 символов. Перед тем, как прийти в SO, неплохо прочитать ваш код и заметить очевидное очевидное. И вы должны компилировать с высокими уровнями предупреждений, чтобы поймать другие довольно очевидные вещи, такие как не всегда возвращать значение из getPrecedence .
  • 2
    Почему вы просто не использовали std :: string? Тогда у вас не было бы этих проблем, и вы бы опубликовали вопрос в ожидании ответов на SO. #include <string> //... std::string expression; expression="x=(0+1)+(y=2+3)";
Показать ещё 4 комментария
Теги:
data-structures
memory

2 ответа

5
Лучший ответ

Ну, первая проблема, которую я вижу, заключается в том, что вы копируете 15 символов + нулевой ограничитель в выражение [10]. В принципе, вы набиваете 16 фунтов в 10-фунтовый мешок.

  • 0
    Спасибо, это сработало. Можете ли вы объяснить, что означает эта ошибка и почему был уничтожен стек вокруг выражения? Что это за стек?
  • 0
    Записывая в выражение 16 байтов, вы забили 6 байтов за пределы конца выражения. Мы все сделали такие ошибки. @PaulMcKenzie (выше) рекомендует использовать std :: string для хранения текста, и я от всей души одобряю это. Современный код C ++ полностью уходит от массивов к std :: string, std :: vector и друзьям. Вы должны посмотреть на это.
Показать ещё 1 комментарий
0
char expression[10];

//<snip>

strcpy(expression,"x=(0+1)+(y=2+3)");

Посмотрите на то, что вы копируете в expression (не забывайте о конце \0). Вы выделили 10 пробелов в своем массиве, но вы пытаетесь сохранить 16 в нем, и вы переполняете свой буфер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню