2016-11-08 3 views
1

Ниже приводится реализацией инфикса для суффикса преобразования, он работает нормально на моем компьютере, но, как я вношу в на SPOJ это дает мне Runtime Ошибка SIGSEGV, я новичок конкурентное программирование, и я не могу справиться с такими типами ошибок.SPOJ - Ошибка выполнение SIGSEGV

#include <iostream> 
#include <stack> 
#include<string.h> 
#include<ctype.h> 
using namespace std; 
int prec(char ch){ 
    switch(ch){ 
     case '^' : return 3; 
        break; 
     case '*': 
     case '/': return 2; 
       break; 
     case '+': 
     case '-': return 1; 
       break; 
     default: return -1; 
    } 
} 
void pti(char a[]){ 
    stack<int> post; 
    int k = -1; 
    for(int i = 0;i<strlen(a);i++){ 
     if(isalnum(a[i])) 
      a[++k] = a[i]; 
     else if(a[i] == '(') 
      post.push(a[i]); 
     else if(a[i] == ')'){ 
      while(!post.empty() && post.top()!= '('){ 
       a[++k] = post.top(); 
       post.pop(); 
      } 
      post.pop(); 
     } 
     else { 
      while(!post.empty() && prec(a[i]) <= prec(post.top())){ 
       a[++k] = post.top(); 
       post.pop(); 
      } 
      post.push(a[i]); 
     } 
    } 
    while(!post.empty()){ 
     a[++k] = post.top(); 
     post.pop(); 
    } 
    a[++k] = '\0'; 
    cout<<a<<endl; 
} 
int main() 
{ 
    int t; 
    cin>>t; 
    for(int i = 0;i<t;i++){ 
     char a[100]; 
     cin>>a; 
     pti(a); 
    } 
} 
+0

Что произойдет, если пользовательский ввод больше 100? Кроме того, предпочитайте std :: string вместо char array – Garf365

ответ

0

Вам просто нужно сделать входной массив более длинным, например. размер 1000 получает AC.

Сигнал SIGSEGV означает, что произошла ошибка сегментации, что в основном означает, что вы получили доступ к памяти, которая не принадлежит вам.

Смежные вопросы