我正在尝试制作可以执行以下操作的反向波兰打印机 -
输入:
(a+(b*c))
((a+b)*(z+x))
((a+t)*((b+(a+c))^(c+d)))
输出:
abc*+
ab+zx+*
at+bac++cd+^*
这是我的代码:
#include <stdio.h>
#include <string.h>
char pop(int t);
void push(int c, int t);
int main()
{
int z;
scanf("%d", &z);
char *a[100];
int i = 0;
int q = z;
while (q-- > 0)
{
char v[400];
scanf("%s", &v);
int t;
for (t = 0; t < strlen(v); t++) //loop to put the values and signs in the 2 stacks
{
if ((v[t] == '*') || (v[t] == '+') || (v[t] == '-') || (v[t] == '^'))
{
push(v[t], 2);
}
else if (v[t] == ')')
{
int y = pop(2);
push(y, 1);
}
else
{
push(v[t], 1);
}
}
int k = 0;
char c;
while ((c = pop(1)) !='\0') //loop to put elements in the array v
{
if (c != '(')
{
v[k++] = c;
}
}
v[k--] = '\0';
int m;
for (m=0; m != k; m++, k--) //for reversing the string
{
char t = v[m];
v[m] = v[k];
v[k] = t;
}
a[i++] =v;
printf("%s",a[i - 1]);
}
int p;
for (p = 0; p <z ; p++) //printing the elements
printf("%s\n",*a[p]);
return 0;
}
char ac[400];
char as[400];
int ic = 0;
int is = 0;
void push(int c,int t)
{
if (t == 1 && ic != 400)
ac[ic++] = c;
else if (t == 2 && is != 400)
as[is++] = c;
}
char pop(int t)
{
if (t == 1 && ic != 0)
return ac[--ic];
if (t == 2 && is != 0)
return as[--is];
return '\0';
}
但它甚至没有正确输入,我无法弄清楚这段代码中的错误。请帮助弄清楚有什么问题。
答案 0 :(得分:0)
在输入no测试用例ieint z和第一行输入后输入 它崩溃了
这是由于
printf("%s\n",*a[p]);
正如BLUEPIXY注意到的那样, *a[p]
是char
;但%s
需要char *
,因此您需要
printf("%s\n", a[p]);
并且关于 v
超出范围,关键因素不是范围(可见性),而是v
的存储持续时间(生命周期) - 其生命周期结束当与之关联的块的执行结束时,指针a[i]
的值变为不确定;通过改变
a[i++] =v;
到
a[i++] = strdup(v);
你可以解决这个问题。