为什么我的反向抛光符号输出错误的输出

  • 本文关键字:输出 抛光 错误 符号 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

问题可能是这个

char input;

请注意,getchar返回一个int,您可能会遇到EOF或值>127

尝试

int input;

运行调试器后,就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),后跟+符号和另一个换行符(即4n+n)。(旁白:当您处理换行时,您不会将X设置回 0,从而导致X==buffer[i],这可能是一个问题,因为这意味着当您遇到'+'X = buffer[i] + XX = 2 * X相同。我正在利用此错误来简化解释,因为它不会影响1111错误,但您应该修复它。

错误设置(处理输入):

  1. '4'不等于'n'(0x0A),也不等于'+'(0x2B),因此代码流继续else部分。
  2. tmp==0此时,导致X = input - 0x30X = 4,后跟tmp = 1。代码流跳回到L1
  3. 检测到'n'(0x0A),因此代码流继续if部分。
  4. 此时i==0buffer[i]==0,因此跳过i++
  5. 执行buffer[0] = Xtmp = 0,代码流跳回到L1
  6. 现在检测到'+'(0x2B),因此代码流进入else if部分。

此时,您有i==0buffer[0]==4X==4tmp==0input=='+'(0x2B)。现在对于错误:

  1. X = buffer[i] + X被执行,或X = 8.
  2. 执行buffer[0] = 0,然后执行tmp = X(8) 和y = 0
  3. output = 0被执行。
  4. tmp = tmp - power[y]被执行。请记住,tmp只是设置为 8,然后y==0.power[0]==10000,表示您正在执行tmp = 8 - 10000tmp = -9992
  5. 执行output++output=1.
  6. -9992 < 10000,因此goto L3被跳过。
  7. -9992 < 8,所以你做output = output + 0x30,或者output = '1'putchar(output)
  8. y++被执行,然后是goto L2
  9. output = 0,后跟tmp = -9992 - 1000tmp = -10992
  10. output++output = 1,后跟output = output + 0x30putchar(output)
  11. 这种逻辑在步骤 3 循环,直到你到达power[4],即 0。
  12. tmp < 0,因此您不执行if (tmp >= 0)语句的正文。
  13. 你跳回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;
}

编辑:您在注释中链接的 C 代码确实做了这件事。换句话说,你只是搞砸了逻辑,甚至可能认为你有一个do-while循环(每次运行循环后检查条件),而你有一个while循环(每次运行循环之前检查条件)。

最新更新