spoj - opn - 转换表达式 - 分段错误

时间:2013-04-13 18:31:54

标签: c segmentation-fault

我第一次尝试在spoj上提交解决方案, 这是我解决transform the expression problem on spoj的解决方案。我收到SIGSEV错误,这是一个运行时错误,分段错误。 我在代码中检查了很多,但我在代码中没有看到任何这样的错误。 Plz帮助解决这个问题。

我有编辑代码: -

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int precedence(char c)
{
switch (c)
{
    case '/':
        return 2;

    case '*':
        return 2;

    case '+':
        return 1;

    case '-':
        return 1;

    case '^':
        return 3;

    case ')':
        return 4;

    case '(':
        return -1;

    default:
        return -1 ;
}
}

int main()
{
 //char input[400]="a*(b+c)-d/e";
 // char input[400]="a+b*c-d/e*f";
 // char input[400] = "(a+b*c-d)/(e*f)";
 // char input[400] = "(a+(b*c))" ;
 //char input[400] = "((a+b)*(z+x))";
 // char input[400] = "((a+t)*((b+(a+c))^(c+d)))";
 char input[402];
 char *stack;
 char *output;
 char *p = input ;
 int i , top  , t  , l ;


scanf("%d",&t);


while (t-- != 0 )
{
    scanf("%s",input);
    p = input ;
    i = 0 ;
    top = 0 ;
    l = strlen(input);
    stack = (char *)malloc(sizeof(strlen(input)));
    output = (char *)malloc(sizeof(strlen(input)));


    stack[top++]='(';

    *(p+l)=')';
    *(p+l+1)= '\0';


    while(p[0] != '\0')
    {
        if (p[0] >= 'a' && p[0] <= 'z' )
        {
            output[i]=p[0];
            i++;
        }
        else if (p[0] == '(')
        {
            stack[top++] = p[0];
        }
        else if (p[0] == ')')
        {
            while (stack[top-1] != '(')
            {
                --top;
                output[i] = stack[top];

                i++ ;
            }
            //to remove the left parenthesis
            top--;

        }
        else if (p[0] == '+' || p[0] == '-' || p[0] == '*' || p[0] == '/' || p[0]=='^')
        {
            while(precedence(stack[top-1]) >= precedence(p[0]))
            {
                output[i]=stack[top-1];
                top--;
                i++;
                //j = k;
            }
            stack[top] = p[0];
            top++;
        }

        p++;
    }
    printf("%s\n",output);
    free(stack);
    free(output);

for(i = (strlen(input)-1) ; i >= 0 ; i--)
    input[i]='\0';


}

return 0 ;
}

1 个答案:

答案 0 :(得分:3)

*(p+strlen(p))=')';

覆盖p的0终结符,然后

*(p+strlen(p))= '\0';

此中的strlen(p)可能找不到任何0终止符,并导致段错误。此外,无论如何,该行是多余的,*(p + strlen(p))的定义已经为strlen(如果p是一个字符串,即0终止)。

如果要在末尾添加')',请存储长度

size_t len = strlen(p);
p[len] = ')';
p[len+1] = 0;

并使用两次。 但请确保您已分配足够的空间。