我有以下程序:
#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
答案 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,但你应该修复它。)
错误设置(处理输入):
'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)
。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;
}
。关于修复,一种可能性是这样做:
do-while
修改:您链接的C code in a comment做了这件事。换句话说,你只是搞砸了逻辑,甚至可能认为你有一个while
循环(在每次循环运行后检查条件)你有一个{{1}}循环(在每次运行之前检查条件)循环)。