постфиксная нотация - Справка по всплыванию и отправке стека, адрес памяти печатается вместо фактических чисел

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

аргумент командной строки: "2 2 +"

  #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);
              printf("%d\n", a);
              b = pop(&ph);
              printf("%d\n", b);
              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(b,a);
              push(&ph, val);
          }

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

          else {
              push(&ph, 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;
  }

Я поместил операторы printf в оператор my else if для добавления, а также всплывающее окно в конце, но если я запускаю, я получаю этот вывод:

6956340 6956337 13912677

что заставляет меня поверить, что он печатает адреса памяти вместо фактических значений, которые передаются.

каким был бы правильный способ написать мой код, чтобы, если бы «2 2 +» был аргументом моего кода, ответ был бы 4, или мои текущие операторы printf стали бы «2 2 4»?


person LatentDenis    schedule 01.07.2014    source источник
comment
Первый шаг: Скомпилируйте с включенными предупреждениями. Это невозможно переоценить. Компилятор сообщит вам, что вы вставляете char* в int.   -  person Jim Balter    schedule 01.07.2014


Ответы (3)


Ты прав. Путем помещения адресов строк argv[] в стек с помощью push(&ph, argv[i]. Вместо этого вы должны push(&ph, atoi(argv[i]).

person Jakub    schedule 01.07.2014
comment
Благодарность!! это сработало. но есть один тест, через который я прохожу, который не имеет для меня особого смысла. если я передам 2 4 ^ 2 * 5 % 2 -, он должен выдать 0, вместо этого я получаю -2. есть идеи, почему это так? - person LatentDenis; 01.07.2014
comment
Вы действительно хотите вычислить побитовое XOR 2 и 4 в первой операции? - person Jakub; 01.07.2014
comment
Я думал, что это 4 ^ 2, = 16, 16 * 2 = 32, 32% 5 = 2, 2-2 = 0? - person LatentDenis; 01.07.2014
comment
Извините, не могу полностью уделить внимание этому разговору. Но это поможет: stackoverflow. ком/вопросы/4843304/ - person Jakub; 01.07.2014

argv[i] - это строка (char*), а не целое число, но вы передаете ее push(), как если бы это было целое число.

Вам нужно преобразовать его в int (возможно, через atoi()), прежде чем помещать его в стек. Или вы можете изменить push, чтобы взять строку и преобразовать ее в int.

person John3136    schedule 01.07.2014
comment
Благодарность!! это сработало. но есть один тест, через который я прохожу, который не имеет для меня особого смысла. если я передам 2 4 ^ 2 * 5 % 2 -, он должен выдать 0, вместо этого я получаю -2. есть идеи, почему это так? - person LatentDenis; 01.07.2014

argv[i] — const char *. Вы нажимаете (&ph, argv[i]); Используйте atoi для преобразования в int.

person Ivan Ivanov    schedule 01.07.2014
comment
Благодарность!! это сработало. но есть один тест, через который я прохожу, который не имеет для меня особого смысла. если я передам 2 4 ^ 2 * 5 % 2 -, он должен выдать 0, вместо этого я получаю -2. есть идеи, почему это так? - person LatentDenis; 01.07.2014