我第一次尝试在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 ;
}
答案 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;
并使用两次。 但请确保您已分配足够的空间。