该计划:
这应该是一个简单的反向抛光符号添加程序,请忽略EOF中断的东西,它是一个占位符。
输入是c,总是一个数字,它被转移到x,其中每个下一个数字c将被添加到数字x,所以例如当我们输入c为1,2和3 x将是123。
当我们输入' e'它将标记新数字的开始,并且在整个堆栈被推回后x将被转移到堆栈[0],并且x将变为0.当输入' +'另外,最后两个数字将相加,x和堆栈中的第一个数字,或堆栈中的第一个和第二个数字,或堆栈中的第一个数字将自行复制。
问题:
堆栈数组中的第一个数字将随机变为0,我无法看到我在哪里犯了错误。第一个数字(stack [0])仅在开始时获得零值,从不再次。有时输入' +'它只会得到一个价值。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int stack[16];
int x;
int i;
char c;
//int c;
x=0;
for (i = 0; i < 16; i++)
{
stack[i]=0;
}
while(1)
{
//input character
scanf("%s", &c);
if (c == EOF) break;
//put x to stack
else if (c == 'e')
{for (i = 15; i >0; i--)
{
stack[i]=stack[i-1];
}
stack[0] = x;
x = 0;
}
//reverse polish addition
else if (c == '+')
//if x is 0 go immediately to the stack
{if (x == 0)
//if both x and the second number in array are 0 just duplicate the first number
if (stack[1] == 0)
stack[0] = stack[0] + stack[0];
//if only x is 0 add the first number on the second
else
{
stack[0]=stack[0]+stack[1];
//push back the array to fill the gap on the second number
for (i = 1; i <15; i++)
{
stack[i]=stack[i+1];
}
}
else
{
stack[0] = stack[0] + x;
x = 0;
}
}
else
{
x = x * 10 + ((int)c-0x30);
// putchar(c);
}
printf("X=%d\n",x);
//print stack
for (i = 0; i < 16; i++)
{
printf("%d \t",stack[i]);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:1)
scanf("%s", &c);
导致未定义的行为。使用scanf(" %c", &c);
。
c
EOF
永远不会等于scanf
。因此,以下行无用。
if (c == EOF) break;
以下将解决这两个问题。
// Use " %c" instead of "%c" to skip leading whitespace characters.
while ( scanf(" %c", &c) == 1 )
{
}