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