为什么我的反向抛光表示法输出错误的输出

时间:2018-04-14 08:47:01

标签: c

我有以下程序:

#include <stdio.h>

char input;
int X;
int buffer[16];
int i = 0;
int y = 0;
int tmp;
int tmp_va;
int output = 0;
int power[5] = {10000,1000,100,10,0};


int main()
{
  L1:
    input = getchar();



if(input == 0x0A){
  putchar(0x0A);

    if(buffer[i] > 0){
      i++;

    }
    buffer[i] = X;

  tmp = 0;
  }



      else if(input == 0x2B){
        putchar(0x2B);
        putchar(0x0A);
        X = buffer[i] + X;
        buffer[i] = 0;


        tmp = X;
        y = 0;
          L2:
            output = 0;

                tmp = tmp - power[y];
                output++;
                L3:
              if(tmp >= power[y]){
                goto L3;
              }
             if(tmp < X){
               output = output + 0x30;
               putchar(output);
             }
             y++;
          if(power[y] > 0){
            goto L2;
          }


         if(tmp >= 0){
          tmp = tmp + 0x30;
          putchar(tmp);
        }

        tmp = 0;


        if(i > 0){
          i--;
        }
     }

      else{
        putchar(input);
        if(tmp == 0){
          X = input - 0x30;
        }
        else{
          tmp_va = X;
          X = X << 3;
          tmp_va = tmp_va << 1;
          X = X + tmp_va;
          X = X + input - 0x30;
        }
        tmp = 1;
      }if (input != EOF){
        goto L1;
    }

    }

并且它完成它应该做的事情,也就是它应该以反向波兰表示法添加数字。但是当我输入一个等式时,它总是输出

111

而不是正确的答案。它再次输出输入是故意的。

顺便说一下,我知道它有goto循环,这是一个要求。我非常感谢任何帮助

它的工作方式是: 你输入例如

您输入:3
它输出3
你输入4+
它输出4+
它输出7
它的作用:

您输入:3
它输出3
你输入4+
它输出4+
它输出1111

所以它看起来像这样 3
3
4+
4+
7

但它确实如此 3
3
4+
4+
1111

2 个答案:

答案 0 :(得分:1)

问题可能是这个

char input;

请注意,getchar会返回int,您可能会遇到EOF或值&gt;的问题127

尝试

int input;

答案 1 :(得分:0)

在运行调试器之后,就1111输出而言,它看起来像您的主要问题,在这一部分您可以添加内容并输出结果:

int power[5] = {10000, 1000, 100, 10, 0};

/* skipping code */

tmp = X;
y = 0;
 L2: 
    output = 0;
    /* moved L3 from question's code to avoid loop issue */
     L3:
        tmp = tmp - power[y];
        output++;
        if (tmp >= power[y]) {
            goto L3;
        }
    if (tmp < X) {
        output = output + 0x30;
        putchar(output);
    }
    y++;
    if (power[y] > 0) {
        goto L2;
    }
if (tmp >= 0) {
    tmp = tmp + 0x30;
    putchar(tmp);
}

假设您输入4,然后输入换行符(0x0A),然后输入+符号和另一个换行符(即4\n+\n)。 (旁白:处理换行符时,您不会将X设置为0,从而产生X==buffer[i],这可能是个问题,因为这意味着X = buffer[i] + X与{X = 2 * X相同1}}当你遇到'+'时。我正在利用这个bug来保持解释更简单,因为它不会影响1111 bug,但你应该修复它。)

错误设置(处理输入):

  1. '4'不等于'\n'(0x0A),也不等于'+'(0x2B),因此代码流程会转到else部分。
  2. 此时
  3. tmp==0,产生X = input - 0x30X = 4,然后是tmp = 1。代码流跳回L1
  4. 检测到
  5. '\n'(0x0A),因此代码流程将进入if部分。
  6. 此时
  7. i==0,以及buffer[i]==0,因此会跳过i++
  8. buffer[0] = Xtmp = 0已执行,代码流会跳回L1
  9. 现在检测到'+'(0x2B),因此代码流程会进入else if部分。
  10. 此时,您有i==0buffer[0]==4X==4tmp==0input=='+'(0x2B)。现在为了错误:

    1. X = buffer[i] + X已执行,或X = 8
    2. 执行了
    3. buffer[0] = 0,然后执行了tmp = X(8)和y = 0
    4. output = 0已执行。
    5. tmp = tmp - power[y]已执行。请记住,tmp只是设置为8,y==0power[0]==10000,表示您正在执行tmp = 8 - 10000tmp = -9992
    6. 执行
    7. output++,设置output=1
    8. -9992 < 10000,因此会跳过goto L3
    9. -9992 < 8,因此您output = output + 0x30output = '1'putchar(output)
    10. y++被执行,然后是goto L2
    11. output = 0,然后是tmp = -9992 - 1000tmp = -10992
    12. output++output = 1,然后是output = output + 0x30putchar(output)
    13. 这种逻辑在步骤3循环,直到你到达power[4],即0。
    14. tmp < 0,因此您不执行if (tmp >= 0)声明的正文。
    15. 你跳回L1,然后重新开始,除了你现在仍然有X(8)和buffer[0]==0的值。您只需从'\n'部分处理+\n即可buffer[0] = Xbuffer[0] = 8 L3: if (tmp >= power[y]) { tmp = tmp - power[y]; output++; goto L3; }
    16. 关于修复,一种可能性是这样做:

      do-while

      修改:您链接的C code in a comment做了这件事。换句话说,你只是搞砸了逻辑,甚至可能认为你有一个while循环(在每次循环运行后检查条件)你有一个{{1}}循环(在每次运行之前检查条件)循环)。