我有以下程序:
#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] + X
与X = 2 * X
相同。我正在利用此错误来简化解释,因为它不会影响1111
错误,但您应该修复它。
错误设置(处理输入):
'4'
不等于'n'
(0x0A),也不等于'+'
(0x2B),因此代码流继续else
部分。tmp==0
此时,导致X = input - 0x30
或X = 4
,后跟tmp = 1
。代码流跳回到L1
。- 检测到
'n'
(0x0A),因此代码流继续if
部分。 - 此时
i==0
,buffer[i]==0
,因此跳过i++
。 - 执行
buffer[0] = X
和tmp = 0
,代码流跳回到L1
。 - 现在检测到
'+'
(0x2B),因此代码流进入else if
部分。
此时,您有i==0
、buffer[0]==4
、X==4
、tmp==0
和input=='+'
(0x2B)。现在对于错误:
X = buffer[i] + X
被执行,或X = 8
.- 执行
buffer[0] = 0
,然后执行tmp = X
(8) 和y = 0
。 output = 0
被执行。tmp = tmp - power[y]
被执行。请记住,tmp
只是设置为 8,然后y==0
.power[0]==10000
,表示您正在执行tmp = 8 - 10000
或tmp = -9992
。- 执行
output++
,output=1
. -9992 < 10000
,因此goto L3
被跳过。-9992 < 8
,所以你做output = output + 0x30
,或者output = '1'
和putchar(output)
。y++
被执行,然后是goto L2
。output = 0
,后跟tmp = -9992 - 1000
或tmp = -10992
。output++
或output = 1
,后跟output = output + 0x30
和putchar(output)
。- 这种逻辑在步骤 3 循环,直到你到达
power[4]
,即 0。 tmp < 0
,因此您不执行if (tmp >= 0)
语句的正文。- 你跳回
L1
,然后重新开始,除了你现在仍然有一个X
(8)和buffer[0]==0
的值。您只需从+n
部分处理'n'
,这将只执行buffer[0] = X
或buffer[0] = 8
。
至于修复,一种可能性可能是这样做:
L3:
if (tmp >= power[y]) {
tmp = tmp - power[y];
output++;
goto L3;
}
编辑:您在注释中链接的 C 代码确实做了这件事。换句话说,你只是搞砸了逻辑,甚至可能认为你有一个do-while
循环(每次运行循环后检查条件),而你有一个while
循环(每次运行循环之前检查条件)。