2016-09-20 54 views
-1

中的平衡圓括號,以便程序打開.c文件並檢查平衡括號,但是我的程序不斷崩潰。我認爲這個問題可能在while循環中檢查文件中的每個字符。檢查C

typedef struct nodo { 
    char llave;   
    struct nodo *sig; 
} nodo; 

void push(struct nodo **top, int nuevo_dato); 
int pop(struct nodo **top); 

bool match(char signo1, char signo2); 
bool check(FILE *fp); 

int main() {  
    int k; 

    printf("Seleccionar Opción\n1.Analizar 1\n2.Analizar 2\n3.Analizar 3\n4.Analizar 4\n5.Salir"); 
    scanf("%d", &k); 

    do { 
     switch (k) { 
     case 1: ; 
      FILE *f1;      
      f1 = fopen("1.c", "r"); 
      if (check(f1)) 
       printf("Damn"); 
      fclose(f1); 
      break; 
     case 2: ; 
      FILE *f2; 
      f2 = fopen("2.c", "r"); 
     case 3: ; 
      FILE *f3; 
      f3 = fopen("3.c", "r"); 
     case 4: ; 
      FILE *f4; 
      f4 = fopen("4.c", "r");    
     }  
    } while (k!=5); 
} 

bool check(FILE *fp) { 
    int j, i = 0; 
    char *signo; 
    nodo *stack = NULL; 
    signo = malloc(100000); 
    while (signo = fgetc(fp) != EOF { 

     if (signo[i] == '{' || signo[i] == '(' || signo[i] == '[') 
      push(&stack, signo[i]); 

     if (signo[i] == '}' || signo[i] == ')' || signo[i] == ']') { 
      if (stack == NULL) { 
       return false; 
      } 
      else if (!match(pop(&stack), signo[i])) { 
       return false; 
      } 
     } 
     i++; 
    } 
} 

bool match(char signo1, char signo2) { 
    if (signo1 == '(' && signo2 == ')') 
     return true; 
    else if (signo1 == '{' && signo2 == '}') 
     return true; 
    else if (signo1 == '[' && signo2 == ']') 
     return true; 
    else 
     return false; 
} 

void push(struct nodo **top, int nueva_llave) { 
    nodo *nuevo_nodo = (struct nodo*)malloc(sizeof(nodo)); 

    if (nuevo_nodo == NULL) { 
     printf("Stack overflow \n"); 
    }   

    /* put in the data */ 
    nuevo_nodo->llave = nueva_llave; 

    /* link the old list off the new node */ 
    nuevo_nodo->sig = (*top); 

    /* move the head to point to the new node */ 
    (*top) = nuevo_nodo; 
} 

/* Function to pop an item from stack*/ 
int pop(struct nodo **top_ref) { 
    char res; 
    struct nodo *top; 

    /*If stack is empty then error */ 
    if (*top_ref == NULL) { 
     printf("Stack overflow \n"); 
    } else { 
     top = *top_ref; 
     res = top->llave; 
     *top_ref = top->sig; 
     free(top); 
     return res; 
    } 
} 
+3

「我似乎無法找到問題所在」。使用調試器。它會立即告訴你哪一行代碼觸發了崩潰,然後你可以從那裏進一步調試。 – kaylum

+2

'scanf(「%d」,k);' - >'scanf(「%d」,&k);' – kaylum

+1

'while while(signo = fgetc(fp)!= EOF){'是錯誤的 – BLUEPIXY

回答

0

具體問題與您的代碼:您pushpopstruct nodo不看好它們封裝什麼類型的數據,有時一個int有時char一致;你的check()函數不能決定是否signo是一個字符或字符串,儘管它返回false,它永遠不會返回true,它應該;如果不正確,你的錯誤處理是不夠的。

下面是基本上運行的代碼的返工。這還不算完代碼,它需要更多的錯誤檢查和其他收尾工作(我剝離出來的文件2 - 4因爲他們沒有調試很重要,你需要將它們添加回):

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

typedef struct nodo { 
    char llave; 
    struct nodo *sig; 
} nodo; 

void push(struct nodo **top, int nuevo_dato); 
int pop(struct nodo **top); 
bool match(int signo1, int signo2); 
bool balanced(FILE *fp); 

int main() { 
    int k; 
    printf("Seleccionar Opción\n1.Analizar 1\n5.Salir\n"); 
    scanf("%d", &k); 

    FILE *f1; 

    switch (k) { 
     case 1: 
      f1 = fopen("1.c", "r"); 

      if (balanced(f1)) { 
       printf("Balanced!\n"); 
      } else { 
       printf("Unbalanced!\n"); 
      } 

      fclose(f1); 

      break; 

     case 5: 
      return EXIT_SUCCESS; 
    } 

    return EXIT_SUCCESS; 
} 

bool balanced(FILE *fp) { 
    nodo *stack = NULL; 

    int signo; 

    while ((signo = fgetc(fp)) != EOF) { 

     if (signo == '{' || signo == '(' || signo == '[') { 
      push(&stack, signo); 
     } else if (signo == '}' || signo == ')' || signo == ']') { 

      if (stack == NULL) { 
       return false; 
      } 

      if (!match(pop(&stack), signo)) { 
       return false; 
      } 
     } 
    } 

    return true; 
} 

bool match(int signo1, int signo2) { 
    if (signo1 == '(' && signo2 == ')') 
     return true; 
    else if (signo1 == '{' && signo2 == '}') 
     return true; 
    else if (signo1 == '[' && signo2 == ']') 
     return true; 

    return false; 
} 

void push(struct nodo **top, int nueva_llave) { 

    nodo *nuevo_nodo = malloc(sizeof(nodo)); 

    if (nuevo_nodo == NULL) { 
     fprintf(stderr, "Insufficient Memory!\n"); 
     exit(EXIT_FAILURE); 
    } 

    /* put in the data */ 
    nuevo_nodo->llave = nueva_llave; 

    /* link the old list off the new node */ 
    nuevo_nodo->sig = *top; 

    /* move the head to point to the new node */ 
    *top = nuevo_nodo; 
} 

/* Function to pop an item from stack */ 
int pop(struct nodo **top_ref) { 

    if (*top_ref == NULL) { 
     /* If stack is empty then error */ 
     fprintf(stderr, "Stack underflow\n"); 
     exit(EXIT_FAILURE); 
    } 

    struct nodo *top = *top_ref; 
    int res = top->llave; 
    *top_ref = top->sig; 
    free(top); 

    return res; 
} 

註上面的代碼不會通過它自己的平衡試驗,這樣的詩句:

if (signo == '{' || signo == '(' || signo == '[') { 

會跳閘的平衡邏輯,並返回false。然而,一個簡單的通用C程序應該通過。

我的整體建議是測試更多的代碼 - 不要期望調試完成的程序。