1

我第一次尝试在 spoj 上提交解决方案,这是我解决在spoj 上转换表达式问题的解决方案。我收到 SIGSEV 错误,这是一个运行时错误,分段错误。我在我的代码中检查了很多,但我没有在我的代码中看到任何此类错误。请帮助解决这个问题。

我有编辑过的代码:-

#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 ;
}
4

1 回答 1

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

覆盖 的 0 终止符p,然后

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

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

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

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

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

于 2013-04-13T18:38:27.707 回答