C:由于未知原因,数组中的第一个数字变为0

时间:2018-04-12 18:56:29

标签: c arrays sorting

该计划:
这应该是一个简单的反向抛光符号添加程序,请忽略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;
}

1 个答案:

答案 0 :(得分:1)

问题1

scanf("%s", &c);导致未定义的行为。使用scanf(" %c", &c);

问题2

使用c

EOF永远不会等于scanf。因此,以下行无用。

    if (c == EOF) break;

以下将解决这两个问题。

// Use " %c" instead of "%c" to skip leading whitespace characters.
while ( scanf(" %c", &c) == 1 )
{
}