ONP中的分段错误

时间:2016-01-26 13:31:37

标签: c algorithm

这是我在spoj中的问题id-4的代码,它在ideone.com中运行完美,但是在它显示分段错误,我无法找到bug.Please help。我已经使用堆栈来实现它。谢谢你提前。 exp是输入字符串,out是输出字符串,int l跟踪输出字符串的索引

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

//declarations
int top = 0;
void push(char ch); 
char pop();
int prec(char c);
char stack[20];
char out[20];
int l = 0;

int main() {
    char exp[20];
    int x, t;
    char temp;
    int i = 0;
    scanf("%d", &t);      //no. of test cases
    while (t--) {
      l=0;
        scanf("%s", exp);
        stack[0] = '(';   //initially pushing '('
        x = strlen(exp);
        exp[x] = ')';     //for completion of statement

        for (i = 0; i < x + 1; i++) {          
            if (exp[i] == '+' || exp[i] == '-' ||
                exp[i] == '/' || exp[i] == '*' || exp[i] == '^') {   //operators
                while (prec(exp[i]) < prec(stack[top])) { //checking precedence
                    out[l] = pop();
                    l++;
                }
                push(exp[i]);
            } else
            if (exp[i] == '(') {
                push(exp[i]);
            } else
            if (exp[i] == ')') {
                while (stack[top] != '(') {
                    out[l] = pop();
                    l++;
                }
                temp = pop();     //to throw out '('
            } else {
                out[l] = exp[i];  //variables
                l++;
            }
        }
        for (i = 0; i < l; i++) {
            printf("%c", out[i]);         //output
        }
    }
    return 0;
}

void push(char c) {            //push operation on stack
    if (top >= 19) {        
    } else {
        top++;
        stack[top] = c;
    }
    return;
}

char pop() {              //pop operation on stack
    char t;
    if (top <= -1) {
        return 0;
    } else {
        t = stack[top];
        top--;
        return t;
    }
}

int prec(char c) {                           //precedence check
    if (c == 94) { return 5; }
    else if (c == 47) { return 4; }
    else if (c == 42) { return 3; }
    else if (c == 43) { return 2; }
    else if (c == 45) { return 1; }
    else { return 0; }
}

2 个答案:

答案 0 :(得分:1)

您必须检查top是否大于或等于0

while( top >= 0 && prec(exp[i])<prec(stack[top])){
//     ^^^^^^^^
....
while( top >= 0 && stack[top]!='('){
//     ^^^^^^^^

发生细分错误,因为您访问stack[top]top小于0。除此之外,我建议一致地增加数组expout的大小。

答案 1 :(得分:1)

用于读取表达式的缓冲区非常小:char exp[20];并且您不会因缓冲区溢出而保护scanf

Sphere Online Judge指定:

  

<强>输入

     
    

t [表达式的数量&lt; = 100]
    表达式[长度&lt; = 400]
    [其他表达]

  

您应该使用更大的堆栈,至少100,更大的缓冲区并使用:

char exp[402];
...
scanf("%400s", exp);

同时测试scanf("%d", &t)的返回值,以防他们故意给你错误的输入。