постфиксная нотация - стек pop и push help, неверное возвращаемое значение возвращается для оператора mod или pow

мой код относительно прост в том, для чего он предназначен, он принимает аргументы командной строки и соответствующим образом размещает стек.

аргумент командной строки: «2 2 +» должен равняться 4.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct stack {

    int top;
    int items[100];

} stack;

void initializeStack(stack* p);
void push(stack* p, int val);
int pop(stack* p);

int main(int argc, char** argv) {

    int i, a, b;
    int val = 0;
    stack ph;
    initializeStack(&ph);

    for(i=1; i<argc; i++) {
        if(strcmp(argv[i], "*") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = a*b;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "/") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b/a;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "+") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = a+b;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "-") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b-a;
            push(&ph, val);
        }

        else if(strcmp(argv[i], "^") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = pow(a,b);
            push(&ph, val);
        }

        else if(strcmp(argv[i], "%") == 0) {
            a = pop(&ph);
            b = pop(&ph);
            val = b%a;
            push(&ph, val);
        }

        else {
            push(&ph, atoi(argv[i]));
        }
    }

    printf("%d\n", pop(&ph));

    return 0;
}

void initializeStack(stack* p) {
    p->top = 0;
}

void push(stack* p, int val) {
    p->top++;
    p->items[p->top] = val;
}

int pop(stack* p) {
    int y;
    y = p->items[p->top];
    p->items[p->top] = 0;
    (p->top)--;
    return y;
}

Я пробовал «2 2 +», и это сработало, как и «2 4 + 3 / 6 +», оно оценивается как 8. но есть проблема, где «2 4 ^ 2 * 5 % 2 - ", где он должен оцениваться как 0, но вместо этого я получаю -2. при чем тут недоработка?


person LatentDenis    schedule 01.07.2014    source источник
comment
может это мой компилятор? Я не понимаю. Я выполнил то же самое и получил -2.   -  person LatentDenis    schedule 01.07.2014
comment
Какая у вас командная строка? Вы деспециализировали * ? Измените свой код и сначала напечатайте аргументы, чтобы убедиться, что ваш env не ввел какое-то странное поведение (экранирование, расширение и т. д.).   -  person Jean-Baptiste Yunès    schedule 01.07.2014
comment
* будет интерпретироваться как все файлы в текущих папках, поэтому вам нужно написать * вместо *   -  person mch    schedule 01.07.2014
comment
хорошо, когда я распечатываю свои аргументы, я получаю 2 4 ^ 2 bin main.c main.c.cbTemp obj postfixnotation.cbp postfixnotation.depend postfixnotation.layout 5 % 2 - -2   -  person LatentDenis    schedule 01.07.2014
comment
В вашем коде никогда не используется items[0], поскольку вы увеличиваете top перед сохранением, что странно. Не уверен, что это ошибка, но это страшно, так как вы рискуете переполниться.   -  person unwind    schedule 01.07.2014


Ответы (1)


как написано в комментариях: вы должны поставить * под «, иначе он будет расширен на все файлы в текущей папке. поэтому назовите его с помощью

 ./a.out 2 4 ^ 2 "*" 5 % 2 -

и это будет работать

person mch    schedule 01.07.2014
comment
Я попытался поместить его в кавычки, но он все равно выдает тот же результат. - person LatentDenis; 01.07.2014
comment
какую ОС вы используете? - person mch; 01.07.2014