Я получаю ошибку неинициализированной локальной переменной в строках 210 и 135 - PullRequest
0 голосов
/ 08 октября 2019

Я получаю ошибку неинициализированной локальной переменной в строке 210 и 135 в этой программе для преобразования инфикса в постфикс. Можете ли вы сказать, что я делаю неправильно?

/*
1)
infix:  A*B+C
postfix: AB*C+

2)
infix:      A+B*C
postfix: ABC*+

3)
infix:      A*B+C*D
postfix: AB*CD*+

4)
infix:      A*B^C+D
postfix: ABC^*D+

5)
infix:      A*(B+C*D)+E
postfix: ABCD*+*E+

6)
infix:      A+(B*C-(D/E^F)*G)*H
postfix:    ABC*DEF^/G*-H*+

7)
infix:      (A+B)*C+D/(E+F*G)-H
postfix: AB+C*DEFG*+/+H-

8)
infix:      A-B-C*(D+E/F-G)-H
postfix:    AB-CDEF/+G-*-H-

*/
#include<stdio.h>
#include<stdlib.h>

//*******************************************
//** STACK
#define size 10

struct stack {

    int count;
    char stack[size];
} s;

void stack_push(char c) {

    if (s.count < size) {

        s.stack[s.count] = c;
        s.count = s.count + 1;
    }
}

char stack_pop() {

    char item;

    if (s.count > 0) {

        s.count = s.count - 1;
        item = s.stack[s.count];
    }

    return item;
}

int stack_isEmpty() {

    return s.count == 0;
}

char stack_topChar() {

    return s.stack[s.count - 1];
}

//*******************************************
//** Aux operations
int isOperand(char c) {

    return c >= 'A' && c <= 'Z';
}

int isOperator(char c) {

    char* operators = "+-*/^\0";

    int result = 0;

    for (int i = 0; operators[i] != '\0'; i++) {

        if (operators[i] == c) {

            result = 1;
            break;
        }
    }

    return result;
}

int getPrecedence(char c) {



    int result = 0;

    switch (c) {

    case '^': result++;
    case '/':
    case '*': result++;
    case '-':
    case '+': result++;
    }

    return result;
}
//*******************************************
//** to Postfix
void toPostfix(char* expression) {

    char* result;
    int idx = 0;

    for (int i = 0; expression[i] != '\0'; i++) {

        char c = expression[i];

        if (isOperand(c)) {

            result[idx++] = c;
        }
        else if (isOperator(c)) {

            char topChar;

            while (1) {

                topChar = stack_topChar();

                if (stack_isEmpty() || topChar == '(') {

                    stack_push(c);
                    break;
                }
                else {

                    int precedenceC = getPrecedence(c);
                    int precedenceTC = getPrecedence(topChar);

                    if (precedenceC > precedenceTC) {

                        stack_push(c);
                        break;
                    }
                    else {

                        char cpop = stack_pop();
                        result[idx++] = cpop;
                    }
                }
            }
        }
        else if (c == '(') {

            stack_push(c);
        }
        else if (c == ')') {

            char cpop = stack_pop();

            while (cpop != '(') {

                result[idx++] = cpop;
                cpop = stack_pop();
            }
        }
    }

    while (!stack_isEmpty()) {

        char c = stack_pop();
        result[idx++] = c;
    }

    result[idx] = '\0';
    printf("%s", result);
}

//*******************************************
//** main
int main() {

    printf("Insert expression: ");
    char* expression;
    char c;
    int idx = 0;

    do {

        c = getchar();

        if (c == '\n' || c == EOF)
            c = '\0';

        expression[idx++] = c;
    } while (c != '\0');

    toPostfix(expression);

    return 0;
}

Я пытался искать решения в Google повсюду и не нашел ни одного, поэтому я надеялся, что вы мне поможете.

Ошибка, которую я получаю, может быть найдена здесь: https://imgur.com/a/nFheImb

1 Ответ

1 голос
/ 08 октября 2019

This:

char *result;

создаст неинициализированный указатель, указывающий на неопределенное местоположение. Это не создает строку. Следовательно, обращение к нему с помощью result[idx++] вызывает неопределенное поведение.

В тех случаях, когда вы просто хотите использовать строку локально, лучше всего создать буфер символов фиксированного размера:

char result[80];

И вы должны убедиться, что никогда не пишете за пределами 80 символов, оставляя место для нулевого символа в конце строки.

Это только быстрое решение вашей непосредственной проблемы. Вы должны изучить массивы, строки C, указатели и распределение памяти, чтобы узнать больше о том, как эти вещи работают в C.

...