我正在尝试在在线编码网站上制作反向波兰打印机,该网站可以执行以下操作 -
输入:
(A +(B * C))
((A + B)*(Z + X))
((A + T)*((B +(A + C))^(C + d))) 输出:
ABC * +
AB + ZX + *
在+ BAC + + CD + ^ *
这是我的代码:
#include <stdio.h>
#include <string.h>
char pop(int t);
void push(int c, int t);
char a[100][400];
int main()
{
int z;
scanf("%d", &z);
int i = 0;
int q = z;
while (q-- > 0)
{
scanf("%s",&a[i][0]);
int t;
for (t = 0; t < strlen(a[i]); t++) //loop to put the values and signs in the 2 stacks
{
if ((a[i][t] == '*') || (a[i][t] == '+') || (a[i][t] == '-') || (a[i][t] == '^'))
{
push(a[i][t], 2);
}
else if (a[i][t] == ')')
{
int y = pop(2);
push(y, 1);
}
else
{
push(a[i][t], 1);
}
}
int k = 0;
char c;
while ((c = pop(1)) !='\0') //loop to put elements in the array v
{
if (c != '(')
{
a[i][k++] = c;
}
}
a[i][k--] = '\0';
int m;
for (m=0; m != k; m++, k--)
{
char t = a[i][m];
a[i][m] = a[i][k];
a[i][k] = t;
}
}
int p;
for (p = 0; p <z ; p++)
printf("%s\n",a[i]);
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';
}
在编译此代码时,我收到了SIGSEGV错误。我不知道这段代码中的错误。请帮助
答案 0 :(得分:0)
我不知道你为什么会得到SIGSEGV。但是,我在您的代码中看到了几个错误。
您使用的是scanf("%s",&a[i][0]);
,但i
永远不会更改其初始值0
。我建议改变
while (q-- > 0)
到
for ( i = 0; i < z; ++i )
即使您使用a[i]
作为for循环索引,也打印p
for (p = 0; p <z ; p++)
printf("%s\n",a[i]);
通过将第二行更改为:
可以轻松解决这个问题 printf("%s\n",a[p]);
在您的输入中,您未包含z
的值。我希望在创建帖子时出错,并且您在输入中的值为z
。
通过这些更改,我的环境中没有任何问题。我用gcc 4.7.3测试过。不确定修复这些问题会解决您环境中的问题。