为什么我为此程序收到SIGSEGV错误?

时间:2015-02-13 16:51:44

标签: c

我正在尝试在在线编码网站上制作反向波兰打印机,该网站可以执行以下操作 -

输入:

(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错误。我不知道这段代码中的错误。请帮助

1 个答案:

答案 0 :(得分:0)

我不知道你为什么会得到SIGSEGV。但是,我在您的代码中看到了几个错误。

  1. 您使用的是scanf("%s",&a[i][0]);,但i永远不会更改其初始值0。我建议改变

    while (q-- > 0)
    

    for ( i = 0; i < z; ++i )
    
  2. 即使您使用a[i]作为for循环索引,也打印p

    for (p = 0; p <z ; p++)   
       printf("%s\n",a[i]);
    

    通过将第二行更改为:

    可以轻松解决这个问题
       printf("%s\n",a[p]);
    
  3. 在您的输入中,您未包含z的值。我希望在创建帖子时出错,并且您在输入中的值为z

  4. 通过这些更改,我的环境中没有任何问题。我用gcc 4.7.3测试过。不确定修复这些问题会解决您环境中的问题。