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

C:由于未知原因,数组中的第一个数字变为0,c,arrays,sorting,C,Arrays,Sorting,该方案: 这应该是一个简单的反向波兰符号加法程序,请忽略EOF中断的东西,它是一个占位符。 输入是c,总是一个数字,它被转移到x,每一个下一个数字c将被添加到数字x,因此,例如,当我们输入c为1,2和3时,x将是123。 当我们输入“e”时,它将标记一个新数字的开始,当整个堆栈被推回后,x将被转移到堆栈[0],x将变为0。当输入“+”加法时,最后两个数字将相加,x和堆栈中的第一个数字,或者堆栈中的第一个和第二个数字,或者堆栈中的第一个数字将自身复制。 问题是: 堆栈数组中的第一个数字将随机变为0

该方案: 这应该是一个简单的反向波兰符号加法程序,请忽略EOF中断的东西,它是一个占位符。 输入是c,总是一个数字,它被转移到x,每一个下一个数字c将被添加到数字x,因此,例如,当我们输入c为1,2和3时,x将是123。 当我们输入“e”时,它将标记一个新数字的开始,当整个堆栈被推回后,x将被转移到堆栈[0],x将变为0。当输入“+”加法时,最后两个数字将相加,x和堆栈中的第一个数字,或者堆栈中的第一个和第二个数字,或者堆栈中的第一个数字将自身复制。 问题是: 堆栈数组中的第一个数字将随机变为0,我看不出在哪里出错。第一个数字堆栈[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 扫描%s,&c;导致未定义的行为。使用scanf%c,&c

问题2 通过使用scanf,c永远不会等于EOF。因此,下面的行是无用的

    if (c == EOF) break;
以下内容将解决这两个问题

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

扫描%s,&c;导致未定义的行为。使用scanf%c,&c;。很难理解你的代码,因为它的格式太差了,我发现-眼睛会用格式不好的代码玩把戏…我建议你多读一点关于如何创建堆栈的知识。这种方法不是很有效,因为每次推送或弹出某个内容时都必须复制整个堆栈。您可以通过取消循环而使用memmove来简化复制,但与使用指针或简单的堆栈顶部索引相比,这仍然是相当低效的。谢谢大家,我将在网上介绍如何使用指针或索引创建堆栈。用%c替换%s实际上会使情况变得更糟,因为x变成了一个随机数,我假设它和x=x*10+intc-0x30有关;使用%c会使x得到随机数,我将看看如何使用前面提到的指针生成堆栈above@happydude,请使用我建议的x更改重试。x未初始化;声明字符c后,它被设置为0。@ChristianGibbons,说得好。OP的代码中一定有其他错误。