2015-02-13 5 views
-1

Я пытаюсь сделать обратный польский принтер на веб-сайт онлайнового кодирования, который может выполнять следующие работы-Почему я получаю ошибку SIGSEGV для этой программы?

Входы:

(а + (Ь * с))

((а + Ь) * (г + х))

((а + Т) * ((Ь + (а + с))^(C + d))) Выходы:

аЬс +

аб + гх + *

при + BAC++ кд +^*

Это мой код:

#include <stdio.h> 
#include <string.h> 
char pop(int t); 
void push(int c, int t); 
char a[100][400]; 
int main() 
{ 
    int z; 
    scanf("%d", &z); 

    int i = 0; 
    int q = z; 
    while (q-- > 0) 
    { 

     scanf("%s",&a[i][0]); 
     int t; 
     for (t = 0; t < strlen(a[i]); t++) //loop to put the values and signs in the 2 stacks 
     { 
      if ((a[i][t] == '*') || (a[i][t] == '+') || (a[i][t] == '-') || (a[i][t] == '^')) 
      { 
       push(a[i][t], 2); 


      } 

      else if (a[i][t] == ')') 
      { 
       int y = pop(2); 
       push(y, 1); 

      } 

      else 
      { 
       push(a[i][t], 1); 

      } 
     } 
     int k = 0; 
     char c; 
     while ((c = pop(1)) !='\0') //loop to put elements in the array v 
     { 

      if (c != '(') 
      { 

       a[i][k++] = c; 

      } 
     } 
     a[i][k--] = '\0'; 
     int m; 
     for (m=0; m != k; m++, k--)  
     { 
      char t = a[i][m]; 
      a[i][m] = a[i][k]; 
      a[i][k] = t; 
     } 



    } 
    int p; 
    for (p = 0; p <z ; p++) 
     printf("%s\n",a[i]); 
    return 0; 
} 
char ac[400]; 
char as[400]; 
int ic = 0; 
int is = 0; 
void push(int c,int t) 
{ 
    if (t == 1 && ic != 400) 
     ac[ic++] = c; 
    else if (t == 2 && is != 400) 
     as[is++] = c; 
} 
char pop(int t) 
{ 
    if (t == 1 && ic != 0) 
     return ac[--ic]; 
    if (t == 2 && is != 0) 
     return as[--is]; 
    return '\0'; 
} 

На компиляции этого кода я получаю SIGSEGV error.I не знаю, Что ошибка в этом коде. Пожалуйста, помогите

+2

Используйте отладчик. –

+0

Компиляция результатов в segfault, а не результат? – Deduplicator

+0

Если вы получите это при компиляции, то что-то не так с вашим компилятором (что звучит маловероятно). –

ответ

0

Я не знаю, почему вы получаете SIGSEGV. Однако я вижу пару ошибок в вашем коде.

  1. Вы используете scanf("%s",&a[i][0]); но i никогда не изменяется от начального значения 0. Я предлагаю изменение

    while (q-- > 0) 
    

    в

    for (i = 0; i < z; ++i) 
    
  2. Вы печатаете a[i], даже если вы используете p как для индекса петли в

    for (p = 0; p <z ; p++) 
        printf("%s\n",a[i]); 
    

    Это легко исправить, изменив вторую линию до:

    printf("%s\n",a[p]); 
    
  3. На вашем входе вы не указали значение z. Я надеюсь, что это ошибка при создании сообщения и что у вас есть значение z на вашем входе.

С этими изменениями я не вижу проблем в своей среде. Я тестировал gcc 4.7.3. Не уверен, что их исправление устранит проблему в вашей среде.

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