【问题标题】:postfix notation - Stack pop and push help, memory address printed instead of actual numbers后缀符号 - 堆栈弹出和推送帮助,打印内存地址而不是实际数字
【发布时间】:2014-08-21 14:46:51
【问题描述】:

我的代码的目标相对简单,它接受命令行参数并相应地放置堆栈。

命令行参数:“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;
  }

我已经在我的 else if 语句中添加了 printf 语句以进行添加以及最后的 pop,但是如果我运行,我会得到以下输出:

6956340 6956337 13912677

这让我相信它打印的是内存地址,而不是传入的实际值。

编写代码的正确方法是什么,以便如果“2 2 +”是我的代码参数,答案将是 4,或者我当前的 printf 语句将变为“2 2 4”?

【问题讨论】:

  • 第一步:编译时启用警告。 这一点怎么强调都不过分。编译器会告诉你,你将 char* 粘贴到 int 中。

标签: c stack command-line-arguments postfix-notation


【解决方案1】:

你是对的。通过push(&amp;ph, argv[i] 将 argv[] 字符串的推送地址推入堆栈。 您应该改为push(&amp;ph, atoi(argv[i])

【讨论】:

  • 谢谢!!那行得通。但是我通过了一项测试,这对我来说没有多大意义。如果我通过“2 4 ^ 2 * 5 % 2 -”,它应该产生 0,而不是我得到 -2。知道为什么会这样吗?
  • 你真的要在第一次运算中计算 2 和 4 的按位异或吗?
  • 我以为是4^2, =16, 16*2=32, 32%5=2, 2-2=0?
  • 抱歉,无法完全关注此对话。但这会有所帮助:stackoverflow.com/questions/4843304/…
【解决方案2】:

argv[i] 是 const char *。你推(&ph, argv[i]);使用 atoi 转换为 int。

【讨论】:

  • 谢谢!!那行得通。但是我通过的一项测试对我来说没有多大意义。如果我通过“2 4 ^ 2 * 5 % 2 -”,它应该产生 0,而不是我得到 -2。知道为什么会这样吗?
【解决方案3】:

argv[i] 是字符串 (char*) 而不是 int,但您将其传递给 push(),就好像它是 int。

在将其推入堆栈之前,您需要将其转换为 int(可能通过 atoi())。或者您可以更改 push 以获取一个字符串并将其转换为 int 。

【讨论】:

  • 谢谢!!那行得通。但是我通过的一项测试对我来说没有多大意义。如果我通过“2 4 ^ 2 * 5 % 2 -”,它应该产生 0,而不是我得到 -2。知道为什么会这样吗?
猜你喜欢
  • 2019-04-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2021-12-30
  • 2018-10-29
相关资源
最近更新 更多