我写了一个程序,可以将表达式从算术中缀表示法转换为后缀。这部分程序没有问题。但只有当字符在7之后最大值为7时,它才会转换,因为它的节目退出了,分段错误。
第108行或第97行可能有错误。
请解释一下hoe malloc的工作。我用malloc编写了2-3个程序,但每个程序都会出现分段错误。
这里的代码:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
struct stack
{
char *arr;
int top;
int size;
};
int isEmpty(struct stack *sp)
{
if(sp->top == -1 )
{
return 1;
}
else
{
return 0;
}
}
void push(struct stack *sp, char exp)
{
sp->top++;
sp->arr[sp->top] = exp;
}
char pop(struct stack *sp)
{
if(isEmpty(sp))
{
printf("stack underflown");
return -1;
}
else
{
char val = sp->arr[sp->top];
sp->top--;
return val;
}
}
int operator(char ch)
{
if(ch =='*' || ch =='/' || ch =='+' || ch =='-')
{
return 1;
}
else{
return 0;
}
}
int stackTop(struct stack* sp){
return sp->arr[sp->top];
}
int precedence(char ch)
{
if(ch =='*' || ch =='/' )
{
return 3;
}
else if(ch =='+' || ch =='-' )
{
return 2;
}
else
{
return 0;
}
}
char* conversion(char *exp)
{
struct stack *sp = malloc(sizeof(struct stack));
sp->top = -1;
sp->size = 100;
sp->arr = (char*)malloc(sp->size*sizeof(char));
char *pref = (char*)malloc((strlen(exp)+1)*sizeof(char));
int i=0,j=0;
while(exp[i]!=' ')
{
if(!operator(exp[i]))
{
pref[j] = exp[i];
j++;
i++;
}
else
{
if(precedence(exp[i])> precedence(stackTop(sp)))
{
push(sp, exp[i]);
i++;
}
else{
pref[j] = pop(sp);
j++;
}
}
}
while(!isEmpty(sp))
{
pref[j] = pop(sp);
j++;
}
pref[j] = ' ';
return pref;
}
int main(void)
{
char exp;
printf("Enter the expression:n");
scanf("%s", &exp);
char *inf = &exp;
printf("Finally: %s", conversion(inf));
}
char exp;
printf("Enter the expression:n");
scanf("%s", &exp);
char *inf = &exp;
很糟糕。exp
只能容纳一个字符,但您正在尝试读取其中的多个字符,从而导致危险的超范围写入。
您应该分配足够的元素并指定要读取的最大长度,以避免缓冲区溢出。最大长度应该是缓冲区大小减去终止空字符的一。
char exp[102400]; /* allocate enough size */
printf("Enter the expression:n");
scanf("%102399s", exp); /* remove & and specify the maximum length */
char *inf = exp; /* remove & */