c - 尝试在 C 中执行 RPN 时如何修复分段错误
问题描述
我正在尝试制作一个使用 RPN 的程序,它将计算一系列整数。我有一些无法更改的标准函数 ( pop
, )。push
但是当我运行下面的代码时,我得到一个分段错误。
由于我无法更改这两个函数的内部核心,因此我尝试更改调用它们的方式(我创建了stack[]
一个动态数组和top
一个 int 指针),但没有任何改变。
#include <stdio.h>
#include <stdlib.h>
#define N 1000
void push(int stack[],int *t,int obj)
{
if((*t)==(N-1))
{
printf("Stack overflow...\n");
getchar(); //getc
abort();
}
else
stack[++(*t)]=obj;
}
int pop(int stack[],int *t)
{
int r;
if((*t<0))
{
printf("Stack empty...\n");
printf("Error in expresion.\n");
getchar(); //getc
abort();
}
else
r=stack[(*t)--];
return(r);
}
int isdigit(char in)
{
int flag;
if (in>=48 && in<=57) //if its terminus
flag=1;
else if(in==42 || in==43 || in==45 || in==47) //if its operator
flag=2;
else
flag=0;
return flag;
}
int main(int argc, char** argv) {
int *stack=(int*) malloc(N*sizeof(int));
char input;
int i=0,*top=0,flag;
int num1,num2;
float result;
if (stack == NULL) {
printf("Out of memory!\n");
return (1);
}
printf("Give the Formula: ");
while(input=getchar())
{
flag=isdigit(input);
if(flag==1) //if its terminus
{
push(&stack[i],top,input);
}
if(flag==2) //if its enforcer
{
num1=pop(&stack[i],top);
num2=pop(&stack[i+1],top);
if (input==42) //case of +
result=num1+num2;
if (input==43) //case of *
result=num1*num2;
if (input==45) //case of -
result=num2-num1;
if (input==47) //case of /
if(num2!=0)
result=num2/num1;
else
printf("Can't do the operation");
push(&stack[i],top,result);
}
if(flag==0) //case of everything else
{
printf("Error");
exit(1);
}
printf("Operand: %c\n",input);
// for(int j=0;j<strlen(stack);j++)
// printf("stack[%d]=%d\n",i,stack[j]);
//printf current status of stack
i++;
}
return (EXIT_SUCCESS);
}
如果你有一系列整数之类234+*
的,堆栈应该是第一2,3,4,+,*
,第二5,4,*
,第三20
。
解决方案
在main
您定义top
为指针并将其初始化为指向空值。
之后,在 中push
,您尝试通过取消引用空位置*t
。在这里,您会遇到分段错误。
推荐阅读
- r - 在 R 中将 32 位浮点栅格转换为 16 位
- google-cloud-platform - 如何避免“正反馈循环过载问题”?
- flutter - Flutter:如何将小部件放置在容器内的固定居中小部件下方
- python - 等效于 Python 中的 R 包自动化工具
- python - pandas - 读取非结构化 csv 并将其保存在数据框中
- javascript - 将一个对象分成更小的对象
- maven - Maven Wrapper 并生成
- javascript - 创建一个类别名来调用静态方法
- css - 如何在 5 秒后隐藏 svg 动画
- arrays - 如何使用数组查找/替换选定单元格中的多个值?